web-dev-qa-db-ja.com

JAXBを使用してJersey 1.6でJSON出力を生成する方法

@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>

MediaType.APPLICATION_XMLをProducesアノテーションに設定すると、このすべてが機能します。しかし、JSONの場合、次の例外が発生します。

重大:応答に対するマップされた例外:500(内部サーバーエラー)javax.ws.rs.WebApplicationException:com.Sun.jersey.api.MessageException:Java class Java.utilのメッセージ本文ライター.Arrays $ ArrayList、およびJava type Java.util.List、およびMIMEメディアタイプapplication/jsonが見つかりませんでした

私はジャージー1.6を使用しており、チュートリアルによると、JSON形式は追加のプログラミングなしでJAXBで動作するはずです。どうしましたか?

27
Mikhail

私はこれを解決しました。私がする必要があるのは、プロジェクトにjersey-json-1.6.jarライブラリーを追加することだけでした(これはjerseyの必須部分ではありません)。

32
Mikhail

次のパラメーターをweb.xmlファイルのjerseyサーブレットに追加します。これは、jersey-servletの最新の1.xバージョンに必要です。

    <init-param>
        <param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
14
Kamran

私はGoogle App Engineを使用していますが、jersey-bundle-1.17.jarを使用している場合は、追加するまでほとんどの作業が可能です。

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

奇妙なメッセージがたくさん表示されます。これは、いくつかのジャクソンjarファイルを見逃しているためです。 jersey homepage にアクセスして、Zipとバンドルをダウンロードします。バンドルをドロップするだけで、Zipからクラスパスに4つのジャクソン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を追加すると、以下のこの警告が解決されます

Java.lang.NoClassDefFoundError:org/codehaus/jackson/xc/JaxbAnnotationIntrospector

これが誰かの役に立つことを願っています。

6
Daniel

他の答えはうまくいきませんでしたが、ようやくJSONで動作するようになりました。

私はjersey-bundle-1.17.jarを使用していました(asm-3.1.jarとjersey-json-1.17.jarをクラスパスに追加して試してもまだ機能しませんでした)。 12種類のjarファイルを含むZipをダウンロードしてみました。 12個すべてのjarをクラスパスに追加したら、ようやくエラーを取り除き、JSONを返すように機能します。

これが誰かの役に立つことを願っています。

更新:以下は、12のjarファイルを含むZipファイルへのリンクです。 jersey-archive-1.17.Zip

Mavenユーザー向けの別の更新:以下をpom.xmlに追加して、12個のjarを個別に取得します。

    <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>
6
11101101b

@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;
    }
}
0
Steven Wolfe

カムランの答えは私にとってうまくいきました、単に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>
0
Sultan