多年来,我一直试图让托米1.5.2 JAX-RS与杰克逊合作。我想我已经尝试了100种方法。
这是我的最后一次尝试:
我在conf/system.properties中添加了以下内容:
openejb.cxf.jax-rs.providers = org.codehaus.jackson.jaxrs.JacksonJsonProvider, org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider
我在托米的 lib 文件夹中添加了:
我在一个干净的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上的所有帖子,但没有成功。
我真的很感激你的帮助。谢谢。
多亏了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中的 1 和 2
编辑:如果使用自定义 jaxrs 应用程序子类(例如@ApplicationPath),则需要设置此类的限定名称,而不是“jaxrs-application”(这意味着默认应用程序)。
3. 创建一个没有杰克逊就无法工作的 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>
并修改.xml以包含:
cxf.jaxrs.providers = com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider
Tomee 1.5.2
对于此版本,必须为每个资源指定提供程序,因此不像1.6.0那样在应用程序级别。可以在此处找到更多信息。
您可以使用此代码:
...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()
将String转换为Object
我必须补充:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-xc</artifactId>
<version>1.9.13</version>
</dependency>
去舞会。我得到了
java.lang.ClassNotFoundException: org.codehaus.jackson.xc.JaxbAnnotationIntrospector
否则。