Tag: jersey

如何让泽西/jackson序列化空列表; 单个元素列表作为数组

使用Jersey和Jackson创建REST接口,如果列表中包含0或1个元素,如何将列表字段序列化为列表。 例如: @XmlRootElement(name=”foo”) public class Foo { @XmlElement public List getBars() { return this.bars; } } @Path(“foo”) public FooResource { @GET public Foo getFoo() { return theFoo; } } 当bars没有元素时,结果序列化为null ,当它包含单个元素时,它序列化为该元素,而不是包含单个元素的数组。 有没有办法让这些始终序列化为数组? 作为参考,我使用Jersey 1.10和Jackson 1.9.2。

如何从泽西响应中保存文件?

我试图从Web资源使用Jersey下载SWF文件。 我写了以下代码,但无法正确保存文件: Response response = webResource.request(MediaType.APPLICATION_OCTET_STREAM) .cookie(cookie) .post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE)); String binarySWF = response.readEntity(String.class); byte[] SWFByteArray = binarySWF.getBytes(); FileOutputStream fos = new FileOutputStream(new File(“myfile.swf”)); fos.write(SWFByteArray); fos.flush(); fos.close(); 假设响应确实返回SWF文件,因为response.getMediaType返回application/x-shockwave-flash 。 但是当我尝试打开SWF时,没有任何事情发生(也没有错误),这表明我的文件不是从响应中创建的。

相当于Jersey / JAX-RS / REST资源的Servletfilter?

在常规Web应用程序中,我可以为各种路径分配一系列filter,用于validation,授权,错误,日志记录等方面。 优点是我编写servlet以专注于核心function而不必担心基础架构方面。 我可以编写正交,横切filter来进行身份validation,授权等。然后我可以在web.xml中编织它们。 查看web.xml足以向我保证我的应用程序中没有漏洞。 这可能在JAX-RS或Jersey吗? 如果没有,我最好的选择是什么?

使用JAX-RS混淆了JAX-RS和Jersey

我真的很困惑。 我已经尝试了一个带有tomcat的Jax-rs并使用了所有注释,我可以使用url调用我的服务。 所以没有Jax-rs,我可以简单地拥有一个servlet并调用我的服务。 另外,正如我所尝试的那样,jones-rs with jersey(正如我已经研究过它的JAX-RS )以及web.xml中的以下内容。 OutputUi jersey-serlvet com.sun.jersey.spi.container.servlet.ServletContainer com.sun.jersey.config.property.packages org.xxx.carbon.servlet 1 jersey-serlvet /* 然后我有一个与JAX-RS相同的注释,在GET上我可以用正确的URL调用我的服务。 我的问题是,为什么jersey使用servlet? JAX-RS没有使用servlet? 为什么使用JAX-RS ,而我们可以使用一个只是Servlet。

泽西岛:“找不到语法元素”是什么意思?

将Jersey从版本1.15升级到1.17后,它开始记录以下消息: Apr 2, 2013 5:13:06 PM com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes INFO: Couldn’t find grammar element for class java.lang.String 产生此类消息的服务示例: @GET @Path(“/bla/{a}”) @Produces(“application/json”) public String doStuff(@PathParam(“a”) String a) { return a; } 我的第一印象是将此视为错误消息,纯粹基于消息的措辞(“无法找到”)。 但是,它记录在INFO级别,并且它似乎在实践中没有任何影响,因为所有服务都继续工作。 所以我的问题是这些日志消息是否表明我们配置或使用Jersey的方式存在(潜在)问题。 由于以前版本没有发生,我已经检查了发行说明,但没有发现任何相关内容。

从jersey 1.x迁移到jersey 2.x时的NoClassDefFoundError ProcessingException(2.8)

我开发了一个网络服务应用程序,它与jersey 1.x(1.16)工作得很好我最近尝试迁移到最新的稳定版jersey版本2.8 我删除了v1.16的所有jersey jar文件然后我从链接下载了v2.8的jersey jars: https: //jersey.java.net/download.html 根据文档我知道,我应该有最新的servlet jar,servlet jar 2.5或更高版本,所以我下载了servlet-api-2.5.jar并将其添加到/ libs文件夹中。 我下载了javax.ws.rs-api-2.0-m09.jar并将其添加到/ libs我还将最新的jettison v 1.3.3添加到/ libs 但是我在tomcat7上运行时遇到exception,如下所示从jersey 1.x迁移到2.x的确切步骤是什么? 这里缺少什么? 我的Web.xml如下所示 com.tempWSJersey2.WebServices Temp REST Service org.glassfish.jersey.servlet.ServletContainer jersey.config.server.provider.packages com.temp 1 Temp REST Service /* 例外的是 – SEVERE: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/tempWSJersey2]] at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:252) at java.util.concurrent.FutureTask.get(FutureTask.java:111) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123) […]

如何使用jaxb注释使用Jersey将json解组为java bean时使用一些间接

我正在试图解散一些收到的json(来自Jira restful web service)。 问题是:“问题”具有“摘要”属性和字段列表。 摘要不作为接收的json中的属性存在,而是作为“fields”属性的值。 我坚持要对这个结构进行解组: @XmlRootElement class Issue { String summary; List fields; // getters/setters and lots of other fields } 收到JSON: { “expand”:”html”, “self”:”https://example.com/jira/rest/api/latest/issue/XYZ-1234″, “key”:”XYZ-1234″, “fields”: { “summary”: { “name”:”summary”, “type”:”java.lang.String”, “value”:”test 1234″ }, “customfield_10080”: { “name”:”Testeur”, “type”:”com.atlassian.jira.plugin.system.customfieldtypes:userpicker” }, “status”: { “name”:”status”, “type”:”com.atlassian.jira.issue.status.Status”, “value”: { “self”:”https://example.com/jira/rest/api/latest/status/5″, “name”:”Resolved” } }, … }, “transitions”:”https://example.com/jira/rest/api/latest/issue/XYZ-1234/transitions” […]

如何忽略来自不耐烦用户的多次点击?

我有一个查询来回答远程客户端的标准请求。 标准,从服务器外部不占用任何参数。 每当有人向URL提交请求时,例如http://www.example.com/query ,他/她会在响应正文中获取reply.xml的内容,具体取决于数据库当时提供的内容。 reply.xml的内容仅在服务器上的数据库内容上reply.xml更改,并且不会更改任何外部内容,例如查询,输入等等,因此不会从客户端获取参数。 我甚至没有检查任何身份validation – 我们将所有内容留给防火墙。 所以我写了一个@POST方法,比如在发布到http://www.example.com/query的请求上调用query() ,并传递结果。 我使用Jersey ,所有这些都符合规格,除此之外 请求应该是跨时间的。 也就是说,应该一次提供一个请求 – 后续用户单击应该获取HTTP状态为309的消息,除非服务器没有运行我的方法query()调用的查询进程。 怎么做到这一点? 我尝试使query()服务@PUT而不是@POST响应,并得到相同的结果。 也许是关于这个主题的天真Q. 但是,不太熟悉Restful服务。 我可以通过线程化令牌来控制一次只运行一个查询并使同时请求接收HTTP 309,但是必须有更好,更简单的方法在服务器上实现这一点。 我正在使用Tomcat 8,Jersey 1.19。 TIA。 注意:我在其他一些有用的讨论中读过REST中的PUT和POST 。 // ===================== 编辑: 哪个用户提交查询在任何时候都没有任何区别。 假设userA提交了一个查询。 当该查询仍在运行时,即在query()返回对userA的响应之前, userB提交了一个查询。 userB应该得到309–只是因为当时正在处理查询。 无论userA = userB还是userA userB在这里都是无关紧要的,因为当一个查询请求已经运行时,应返回309。 这就是用户获得309的唯一时间。 // ============================================== EDIT 2: 我知道有并发控制的解决方案。 我猜测有一个使用Restfulfunction。 这是一个学术问题。

如何将Grizzly请求注入Jersey ContainerRequestFilter

我有泽西由Grizzly提供。 我有一个ContainerRequestFilter实现类。 但是,为所有传入请求创建此类一次。 因此这样做: public class EndpointRequestFilter implements ContainerRequestFilter { @Context private org.glassfish.grizzly.http.server.Request requestContext; public void filter( ContainerRequestContext req ) throws IOException { // remove for sake of example } } requestContext为null。 我可以将上下文注入到被调用的实际端点中,但这是相当粗糙和丑陋的,对我来说真的没用; 因为我想记录各种要求。 理想情况下,希望在Request的ResponseFilter端获取此Request对象。 必须有一种简单的方法来做到这一点。 到目前为止,我看到的所有问题/答案都不适用于Grizzly或注入REST端点调用的方法。 我不想绕过我所有的数百种方法,只是因为我想得到IP地址! 那么这里的关键是什么? 我错过了什么?

MessageBody Writer / Reader

我试图让Jersey支持GSON ,为此我已经读过我需要实现自定义MessageBodyWriter和MessageBodyReader 。 现在我的问题是我找不到这两个接口的任何明确定义。 从文档: public interface MessageBodyWriter 支持将Java类型转换为流的提供程序的合同。 要添加MessageBodyWriter实现,请使用@Provider注释实现类。 MessageBodyWriter实现可以使用Produces注释,以限制它被认为适合的媒体类型。 和 public interface MessageBodyReader 支持将流转换为Java类型的提供程序的合同。 MessageBodyReader实现可以使用Consumes注释,以限制它被认为适合的媒体类型。 实现MessageBodyReader契约的提供者必须以编程方式在JAX-RS运行时中注册,或者必须使用@Provider注释进行注释,以便在提供者扫描阶段由JAX-RS运行时自动发现。 任何人都能解释一下具体意味着什么吗? 为什么我需要在GSON支持的情况下实现它们? 谢谢。