5

我一直在努力让 Tomee 1.5.2 JAX-RS 与 Jackson 一起工作。我想我已经尝试了 100 种方法。
这是我的最后一次尝试:

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

openejb.cxf.jax-rs.providers = org.codehaus.jackson.jaxrs.JacksonJsonProvider, org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider 


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

  • jackson-mapper-asl-1.9.12.jar
  • 杰克逊核心asl-1.9.12.jar
  • 杰克逊-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上的所有帖子,但没有成功。
我真的很感激一些帮助。谢谢。

4

5 回答 5

9

多亏了Tomee的大力支持,我终于想出了办法。所以……来了!

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

假设您有一个 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>

2. 在 WEB-INF(带有 web.xml 的文件夹)中创建 openejb-jar.xml,其中包含:

<openejb-jar xmlns="http://www.openejb.org/openejb-jar/1.1">
  <pojo-deployment class-name="jaxrs-application">
    <properties>
      cxf.jaxrs.providers = org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider
    </properties>
  </pojo-deployment>
</openejb-jar>

有关此配置的更多信息,请参阅@rmannibucau的12
编辑:如果您使用自定义 jaxrs 应用程序子类(例如使用 @ApplicationPath),您将设置此类的限定名称而不是“jaxrs-application”(这意味着默认应用程序)。 3. 创建一个没有 Jackson 就无法工作的 JAX-RS 资源(例如:一个普通的列表):

import java.util.Arrays;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/jackson")
public class Resource {

  @GET
  @Produces({MediaType.APPLICATION_JSON})
  public Object sayHelloJson() {
    return Arrays.asList(new String[]{"Peter", "pan", "Ihihi"});
  }
}

4. 在 Tomee 1.6.0 JAX-RS 版本上部署并在以下位置启动应用程序:http://localhost:8080/yourAppPath/jackson 本指南在 NetBeans 7.4 上使用版本 1.6.0 2013.10.24 进行了测试。

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

<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.2.3</version>
</dependency>

并修改 openejb-jar.xml 以包含:

cxf.jaxrs.providers = com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider  

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

于 2013-10-29T09:02:56.010 回答
1

您可以使用以下代码:

...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()将字符串转换为对象

于 2013-07-23T18:14:38.237 回答
1

我不得不补充:

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

到 pom。我有

 java.lang.ClassNotFoundException: org.codehaus.jackson.xc.JaxbAnnotationIntrospector

除此以外。

于 2014-03-01T15:41:09.907 回答
1

我在 TomcatEE 中独立使用 openejb,并希望在全球范围内将 Jackson 用于所有 JSon 请求。

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

properties.setProperty("cxf.jaxrs.providers", "com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider");
于 2015-08-07T21:57:26.320 回答
0

我注意到tomee 1.6.0 在其lib 目录中有gson-2.1。所以我们可以使用 gson 代替 jackson,而不依赖于 6 个与 jackson 相关的 jar(与 jackson-jaxrs-json-provider 一起使用)。GsonProvider(而不是 JacksonJaxbJsonProvider)可以在这里找到。我用一个非常简单的例子进行了测试,它工作正常。

于 2013-12-16T03:32:23.360 回答