@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で動作するはずです。どうしましたか?
私はこれを解決しました。私がする必要があるのは、プロジェクトにjersey-json-1.6.jarライブラリーを追加することだけでした(これはjerseyの必須部分ではありません)。
次のパラメーターを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>
私は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
これが誰かの役に立つことを願っています。
他の答えはうまくいきませんでしたが、ようやく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>
@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;
}
}
カムランの答えは私にとってうまくいきました、単に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>