如何使用JAXB使用Jersey 1.6生成JSON输出

时间:2011-05-17 06:31:08

标签: java json rest jackson jax-rs

@XmlRootElement
public class Todo {
    private String s = "test";

    public String getS() {
        return s;
    }

    public void setS(String s) {
        this.s = s;
    }

}

和服务:

@Path("/test")
public class Service {

    @GET
    @Produces({MediaType.APPLICATION_JSON })
    public List<Todo> getAllGadgets() {
        return Arrays.asList(new Todo[] { new Todo() });
    }

}

我的web.xml:

<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.test</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

如果我为Produces批注设置MediaType.APPLICATION_XML,那么这一切都有效。但对于JSON,我得到以下异常:

  

严重:将响应的映射异常:   500内部服务器错误)   javax.ws.rs.WebApplicationException:   com.sun.jersey.api.MessageException:A   用于Java类的消息体编写器   java.util.Arrays $ ArrayList和Java   输入java.util.List,   和MIME媒体类型application / json   没找到

我使用Jersey 1.6,根据教程,JSON格式应该可以在没有任何额外编程的情况下使用JAXB。怎么了?

6 个答案:

答案 0 :(得分:32)

我解决了这个问题。我需要做的就是将jersey-json-1.6.jar库添加到项目中(这不是球衣的一部分)

答案 1 :(得分:14)

将以下参数添加到web.xml文件中的jersey servlet,这是最新1.x版本的jersey-servlet所必需的。

    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>

答案 2 :(得分:6)

其他答案对我不起作用,但我终于让它与JSON合作。

我正在使用jersey-bundle-1.17.jar(也尝试将asm-3.1.jar和jersey-json-1.17.jar添加到classpath中但仍然无效)。我终于尝试下载包含12个不同罐子的拉链。一旦我将所有12个罐子添加到我的类路径中,我终于摆脱了错误,并且很好地返回了JSON。

我希望这有助于某人。

<强>更新 以下是包含12个jar文件的zip文件的链接:jersey-archive-1.17.zip

Maven用户的另一个更新: 将以下内容添加到您的pom.xml中以分别获取12个罐子:

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-servlet</artifactId>
        <version>1.17.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>1.17.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.17.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
        <version>1.17.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.17.1</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.9.2</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.2</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-jaxrs</artifactId>
        <version>1.9.2</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-xc</artifactId>
        <version>1.9.2</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jettison</groupId>
        <artifactId>jettison</artifactId>
        <version>1.1</version>
    </dependency>
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>jsr311-api</artifactId>
        <version>1.1.1</version>
    </dependency>
    <dependency>
        <groupId>asm</groupId>
        <artifactId>asm</artifactId>
        <version>3.1</version>
    </dependency>

答案 3 :(得分:6)

我使用谷歌应用程序引擎并且在这方面也遇到了很多困难,如果你使用jersey-bundle-1.17.jar大多数东西都可以工作,直到你添加

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>
你会得到很多奇怪的消息。这是因为你错过了一些杰克逊罐子。 如果您转到jersey homepage并下载zip和捆绑包。只需删除捆绑包,然后从zip中删除你需要在类路径中添加4个jackson jar,你应该可以正常工作而不会出现任何错误。

添加jackson-jaxrs-1.9.2.jar解决此错误

SEVERE: The registered message body writers compatible with the MIME media type are:
application/json ->

添加jackson-xc-1.9.2.jar解决下面的这个warrning

  

java.lang.NoClassDefFoundError:   组织/ Codehaus的/杰克逊/ XC / JaxbAnnotationIntrospector

我希望这有助于某人。

答案 4 :(得分:0)

如果您没有使用@XmlRootElement注释POJO(或基础POJO),则会引发OP列出的邮件正文撰写者例外。

例如:

@XmlRootElement
public class BaseBean
{
    private Boolean success = Boolean.TRUE;
    private String message;

    /**
     * Empty constructor to satisfy requirements of JAXRS.
     */
    public BaseBean() {}

    /**
     * Returns a simple message to accompany the success/failure.
     * @return
     */
    public String getMessage()
    {
        return message;
    }

    /**
     * Sets the message (if required).
     * @param message
     */
    public void setMessage(String message)
    {
        this.message = message;
    }

    /**
     * Returns a flag indicating whether a request for content was
     * successful.
     * @return
     */
    public Boolean getSuccess()
    {
        return success;
    }

    /**
     * Marks the success of a request for content.
     * @param success
     */
    public void setSuccess(Boolean success)
    {
        this.success = success;
    }
}

答案 5 :(得分:0)

Kamran的回答对我有用,只是为了扩展xml:

    <servlet>
    <servlet-name>JerseyServletContainer</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
    </init-param>