Jakarta ee Tomee 1.5.2 JAX-RS和Jackson 1.9.12

Jakarta ee Tomee 1.5.2 JAX-RS和Jackson 1.9.12,jakarta-ee,jackson,jax-rs,apache-tomee,Jakarta Ee,Jackson,Jax Rs,Apache Tomee,多年来,我一直试图让Tomee1.5.2JAX-RS与Jackson合作。我想我已经试过100种方法了。 这是我最后一次尝试: 我在conf/system.properties中添加了以下内容: openejb.cxf.jax-rs.providers = org.codehaus.jackson.jaxrs.JacksonJsonProvider, org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider <dependency>

多年来,我一直试图让Tomee1.5.2JAX-RS与Jackson合作。我想我已经试过100种方法了。
这是我最后一次尝试:

我在conf/system.properties中添加了以下内容:

openejb.cxf.jax-rs.providers = org.codehaus.jackson.jaxrs.JacksonJsonProvider, org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider 
<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.2.3</version>
</dependency>

我在Tomee的lib文件夹中添加了:

  • jackson-mapper-asl-1.9.12.jar
  • jackson-core-asl-1.9.12.jar
  • jackson-jaxrs-1.9.12.jar

我在一个干净的NetBeans Maven web项目中有一个简单的JAX-RS类。Mirc是一个有名字和汽车的POJO

...imports
@Path("")
public class MyJson {
@GET
@Produces(APPLICATION_JSON)
public Object myMeth() {
    return new Mirc("Peter", "BMW");
}
我一直得到“没有找到响应类myclass的消息正文编写器”。
我错过了什么?我怎样才能让它工作?我检查了stackoverflow上的所有帖子,但没有成功。
我真的很感谢你的帮助。谢谢。

您可以使用以下代码:

...imports
@Path("")
public class MyJson {
@GET
@Produces(APPLICATION_JSON)
public String myMeth() {
    ObjectMapper mapper = new ObjectMapper();
    return mapper.writeValueAsString(new Mirc("Peter", "BMW"));
}
这能解决你的问题吗


您可以使用
mapper.readValue()
将字符串转换为对象

多亏了Tomee的大力支持,我终于找到了方法。所以…在这里

我将首先解释如何在最新版本中实现这一点,该版本将很快作为稳定版本发布。顺便说一句,即使现在也很稳定

假设您有一个Maven Java EE 6 web应用程序项目(使用NetBeans生成一个),以下是步骤:
1.在pom.xml中添加Jackson依赖项

<dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>jackson-jaxrs</artifactId>
  <version>1.9.13</version>
</dependency>
四,。在Tomee 1.6.0 JAX-RS版上部署并在以下位置启动应用程序:
http://localhost:8080/yourAppPath/jackson
本指南使用NetBeans 7.4上的1.6.0 2013.10.24版进行了测试

如果您想要最新的Jackson,请将以前的依赖项替换为以下内容:

openejb.cxf.jax-rs.providers = org.codehaus.jackson.jaxrs.JacksonJsonProvider, org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider 
<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.2.3</version>
</dependency>
第1.5.2节

对于此版本,必须为每个资源指定提供程序,因此不像1.6.0中那样在应用程序级别。可以找到更多信息。

我注意到Tomee1.6.0的lib目录中有gson-2.1。因此,我们可以使用gson代替jackson,而不依赖于6个与jackson相关的jar(与jacksonjaxrsjson提供程序一起提供)。可以找到GsonProvider(而不是JacksonJaxbJsonProvider)。我用一个非常简单的例子进行了测试,它工作正常。

我不得不补充:

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-xc</artifactId>
    <version>1.9.13</version>
</dependency>

否则。

我正在使用Tomcate中的openejb standalone,并希望在所有JSon请求中全局使用Jackson

在服务器启动时,将此属性添加到初始上下文中就成功了。分享因为这很难找到,也许它可以帮助其他人

properties.setProperty("cxf.jaxrs.providers", "com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider");

为什么不返回字符串并使用ObjectMapper?这对meCan有效你能举个例子吗?别忘了,我只想使用POJO,不需要任何其他调用,因此我想集成Jackson。别忘了数据类(
Mirc
)上的
@XmlRootElement
)你成功了吗?如果是的话,你能把你的答案贴在这里吗?@Paaske是的,我有。我很快就会给出一个答案。它可能会起作用,所以谢谢你,但我的目标是从Glassfish&Jackson那里得到同样的行为,那里不需要方法调用。这就是我想要的。否则,我可以在Tomee中使用默认的JAX-RS实现。因此,我不会将此标记为已回答,因为不是。感谢您愿意提供帮助。如果您使用自定义的jaxrs应用程序子类(例如@ApplicationPath),您将设置该类的限定名称,而不是“jaxrs应用程序”(表示默认应用程序)。要配置抛弃,请参阅以下文章:
 java.lang.ClassNotFoundException: org.codehaus.jackson.xc.JaxbAnnotationIntrospector
properties.setProperty("cxf.jaxrs.providers", "com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider");