Tag: jax rs

Jax-rs json相当不错

在Java中我使用的时候 @Produces(“application/json”) 注释输出不会形成人类可读的forms。 我怎么做到这一点?

不直接编写Servlet以创建REST API的原因

在我目前的公司中,我们正在开始一个新项目,该项目将是Java中的REST API,部署在像Tomcat这样的servlet容器中。 在我之前使用REST框架(如JAX-RS和Jersey,JBOSS REST Easy,Spring MVC)的经验中,我知道使用类似于直接编写Servlet来处理请求的框架的一些优点。 (当然我们知道所提到的框架仍然使用Servlets) 我发现很难说服他们。 因为他们建议编写servlet,认为它对性能更好(可能是这种情况,但我认为使用其中一个框架的开销对REST API来说应该是微不足道的)。 以下是我的理由: 1) 更少的样板和更简洁的代码 (更易于维护和测试)。 使用JAX-RS框架或SpringMVC,您可以通过编写带有注释的方法来非常轻松地定义REST资源,注释指示资源的PATH,要使用的http方法,查询和url参数,接受的编码等标题等。 例: @GET @Path(“/users”) @Produces({MediaType.APPLICATION_JSON}) public UserList getUsers(@QueryParam(“group”) String group) { return userService.findUsers(group); } 使用servlet,您至少需要这样的东西: 在web.xml中映射每个servlet的url(在Servlet 3.0中不需要): UsersServlet test.UsersServlet UsersServlet /users 然后在servlet类中: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String group = request.getParameter(“group”); response.setContentType(“application/json”); PrintWriter out = response.getWriter(); […]

在实现中设置JAX-RS响应头而不在接口中暴露HttpServletResponse

我有一个RESTful服务器实现以及一个用于调用客户端的库,所有这些都使用JAX-RS。 服务器组件分为接口FooResource和实现FooResourceService 。 为了让客户端和服务器库共享RESTful路径和其他定义,我想将FooResource接口拆分为自己的项目: @Path(value = “foo”) public interface FooResource { @GET public Bar getBar(@PathParam(value = “{id}”) int id) { 我想在响应中设置一些标题。 一种简单的方法是在方法签名中使用@Context HttpServletResponse : public Bar getBar(@PathParam(value = “{id}”) int id, @Context HttpServletResponse servletResponse) { 但问题是这暴露了界面中的实现细节。 更具体地说,它突然需要我的REST定义项目(在客户端和服务器库之间共享)来引入javax.servlet-api依赖 – 客户端不需要(或者需要)。 我的RESTful资源服务实现如何设置HTTP响应头而不在资源接口中引入该依赖? 我看到一篇文章建议我将HttpServletResponse注入一个类成员。 但是,如果我的资源服务实现是单例,这将如何工作? 是否使用某种代理与线程本地或某些东西来确定正确的servlet响应,即使多个线程同时使用单例类? 还有其他解决方案吗?

javax.ws.rs.core.Cookie vs javax.ws.rs.core.NewCookie,有什么区别?

我在JAX-RS API javax.ws.rs.core.Cookie和javax.ws.rs.core.NewCookie找到了两个类。 一个人比另一个人有什么好处? 我想知道建议使用哪一个以及何时使用? 提前致谢 :)

覆盖DropWizard ConstraintViolation消息

所以我想通过DropWizard资源更改用于validation模型的validation消息。 我正在使用java beanvalidation注释。 例如,这是我要validation的字段之一: @NotEmpty(message = “Password must not be empty.”) 我可以使用validation器按预期测试它的工作原理。 但是,当我使用DropWizard对资源进行validation时,它会为该消息添加一些额外的内容。 我看到的是这个 – password Password must not be empty. (was null) password Password must not be empty. (was null)我发现这里的代码 – https://github.com/dropwizard/dropwizard/blob/master/dropwizard-validation/src/main/java/io/dropwizard/validation/ConstraintViolations。 java的 特别是这种方法 – public static String format(ConstraintViolation v) { if (v.getConstraintDescriptor().getAnnotation() instanceof ValidationMethod) { final ImmutableList nodes = ImmutableList.copyOf(v.getPropertyPath()); final ImmutableList usefulNodes […]

在泽西岛获得rest服务

我对Web服务非常陌生。 我已经使用Jersey 2与Spring集成了一些REST服务。 现在我需要使用用户名/密码进行身份validation来保护这些rest服务。 我被告知不要使用Spring安全性。 我不知道该怎么做。 我在网上搜索,但各种链接显示各种实现,我无法决定如何继续它。 我知道这是一个模糊的问题但请在这方面提供帮助。

RESTEasy – 需要完整路径的@Path?

我正在搞乱JAX-RS并创建了一个调用生成JSON的REST服务的应用程序。 我试过Jersey,一切都很顺利,但我不得不切换到RESTEasy,因为我的应用程序需要用JDK5构建。 我将web.xml更改为以下内容: resteasy.scan true org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap RESTEasy org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher RESTEasy /rest/* 所以我希望每个以/ rest开头的URL都由RESTEasy处理。 我的服务如下: @Path(“/services”) public class MyRESTServices { @GET @Path(“service1”) @Produces(MediaType.APPLICATION_JSON) public Object service1(Blah blah) { } } 使用Jersey工作正常, http:// localhost / MyContext / rest / services / service1绑定到我的service1()方法。 但是当我改为RESTEasy时,我有一个404: HTTP状态404 – 无法找到相对的资源:/ rest / services / service1 of full path: http:// localhost / MyContext […]

NoSuchMethodError:Jersey客户端中的MultivaluedMap.addAll

我正在尝试使用Jersey Client来模拟对我的Web服务的HTTP请求。 我试图从文档中实现这个简单的例子 。 这是我的简短代码: public void restoreTest(String sessionId) throws Exception { Client client = ClientBuilder.newClient(); WebTarget target = client.target(idsUrl).path(“restore”); Form form = new Form(); form.param(“sessionId”, sessionId); target.request(MediaType.APPLICATION_FORM_URLENCODED_TYPE); } 我甚至没有实现整个示例,因为目前我在最后一行得到了一个exception: java.lang.NoSuchMethodError: javax.ws.rs.core.MultivaluedMap.addAll(Ljava/lang/Object;[Ljava/lang/Object;)V at org.glassfish.jersey.client.ClientRequest.accept(ClientRequest.java:254) at org.glassfish.jersey.client.JerseyWebTarget.request(JerseyWebTarget.java:232) at org.glassfish.jersey.client.JerseyWebTarget.request(JerseyWebTarget.java:60) at org.icatproject.idsclient.TestingClient.restoreTest(TestingClient.java:112) at org.icatproject.ids.ids2.ArchiveTest.restoreThenArchiveDataset(ArchiveTest.java:55) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) […]

JAX-RS,将映射到JSON而没有开销?

我正在使用JAX-RS在Java中创建restful webservices。 我在生成的JSON中得到了很多开销。 数据类: @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Test { private Map data; Test() {} public Test(Map data) { this.data = data; } public Map getData() { return data; } } 服务: @GET @Path(“/test”) @Produces(“application/json; charset=UTF-8;”) public Test test() { Map map = new HashMap(); map.put(“foo”, “bar”); map.put(“bingo”, “bongo”); return new Test(map); } 生产: {“data”:{“entry”:[{“key”:”foo”,”value”:”bar”},{“key”:”bingo”,”value”:”bongo”}]}} […]

在Spring应用程序中使用CXF自动发现JAX-RS资源

Apache CXF(2.7.0)是否可以自动发现类路径中的JAX-RS资源 ? 也就是说,用@Path注释的类。 我在Spring应用程序中使用CXF,我必须使用以下XML手动声明资源,即使Spring 成功发现了资源。 我想避免它(因为我可以使用其他JAX-RS实现,例如resteasy)因为在我的情况下它更难维护,并且它迫使我在Spring XML配置文件中声明我的bean依赖项。