JAX-RSサービスをJSONとして使用する際に問題に直面しています。
以下にコードを追加しました。
これは私のサービスクラスです。
//Sets the path to base URL + /hello
@Path("/hello")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class Hello {
@GET
@Produces("application/json")
public Student getStudent() {
Student s = new Student();
s.first_name = "Test First Name !!!";
s.last_name = "Test Last Name!!!";
return s;
}
Student
私がサービスから取得しようとしているクラス:
@XmlRootElement
public class Student implements Serializable {
public String first_name;
public String last_name;
public String getFirst_name() {
return first_name;
}
public void setFirst_name(String first_name) {
this.first_name = first_name;
}
public String getLast_name() {
return last_name;
}
public void setLast_name(String last_name) {
this.last_name = last_name;
}
public Student()
{
first_name = "Fahad";
last_name = "Mullaji";
}
}
サービス側のWeb XML。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://Java.Sun.com/xml/ns/javaee"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>com.vogella.jersey.first</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- Register resources and providers under com.vogella.jersey.first package. -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.vogella.jersey.first</param-value>
</init-param>
<init-param>
<param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</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>
</web-app>
この問題を解決する方法がわかりません。 JSON応答のテストにSOAP UIを使用していますが、それは問題ではないと思います。
私が読んだ多くの場所では、以下のコードを追加する必要があります。しかし、私はどこがわからない。構築にMavenを使用していません。
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
</dependency>
サーバーはStudent
オブジェクトをJSONに解析する関数を探していますが、そのための関数またはjarファイルを見つけることができません。私はゲンソン、モクシー、RESTEasy、ジャクソンの瓶を追加しましたが、それが問題だと思います。どこかにマッピングが欠けていると思います。
さて、私は上記のWebプロジェクトを機能させることができませんでした。しかし、私はJAX-RSの研究を続け、Stormpathのチュートリアルに出くわしました。 REST、JSON、Jerseyがどのように連携するかを学習しようとしている人は誰でもこれを見るべきだと思います。
GitHubでのプレゼンテーションとサンプルRESTプロジェクトについては、以下のリンクをご覧ください。
https://www.youtube.com/watch?v=sVvL12BnIyQ
https://github.com/stormpath/todos-jersey
これで、上記のプロジェクトを比較して、間違ったことをすべて確認できます。
Jersey-media-json-jacksonをインストールすることで修正できました
Pom.xmlに依存関係を追加します
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<scope>runtime</scope>
</dependency>
JAX-RSはクラスを初期化するため、空のコンストラクターを作成する必要があります...コンストラクターには引数が必要ありません。
@XmlRootElement
public class Student implements Serializable {
public String first_name;
public String last_name;
public String getFirst_name() {
return first_name;
}
public void setFirst_name(String first_name) {
this.first_name = first_name;
}
public String getLast_name() {
return last_name;
}
public void setLast_name(String last_name) {
this.last_name = last_name;
}
public Student()
{
first_name = "Fahad";
last_name = "Mullaji";
}
public Student()
{
}
}
私は同じ状況にいました
-MavenまたはAntを使用していたnot、
- ジャージーに関するこのVogellaチュートリアル 、
-そして@Produces(MediaType.APPLICATION_JSON)
を使用しようとすると、MessageBodyWriter
エラーが発生しました。
この回答 @peeskilletが問題を解決します-FasterXMLジャクソンダウンロードページ から入手できるJackson * .jarファイルを使用する必要があります=。core
ファイルとjaxrs
ファイルが必要です。
上記のチュートリアルに従って、Jersey * .jarファイルがあるWebContent/WEB-INF/lib
フォルダーにそれらを追加し、以下のweb.xmlファイルに小さな変更を加えました(元々@peeskilletが共有していた)。
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
your.other.package.here, com.fasterxml.jackson.jaxrs.json
</param-value>
重要な部分はcom.fasterxml.jackson.jaxrs.json
です。
以下のコードのコメントを外して助けました
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
</dependency>
私のMavenベースのプロジェクトのpom.xmlに存在していたため、このエラーは解決しました。
以下は、pom.xmlで他のjersy/jackson依存関係の上にあるはずです。私の場合、以下のようにjersy-client dep-cyとMedia type = application/jsonのMessageBodyWriterが見つかりませんでした。
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.25</version>
</dependency>
データをjson形式に変換してみてください。これは、gson libを使用して実行できます。以下のようなものを試してください。
それが最善の解決策であるかどうかはわかりませんが、この方法でそれを行うことができます。
例: `
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response info(@HeaderParam("Accept") String accept) {
Info information = new Info();
information.setInfo("Calc Application Info");
System.out.println(accept);
if (!accept.equals(MediaType.APPLICATION_JSON)) {
return Response.status(Status.ACCEPTED).entity(information).build();
} else {
Gson jsonConverter = new GsonBuilder().create();
return Response.status(Status.ACCEPTED).entity(jsonConverter.toJson(information)).build();
}
}
この問題を解決するには、次を試してください。私のために働いた。
pom.xmlに次の依存関係を追加します
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.25</version>
</dependency>
そして、モデルクラスに引数コンストラクタなしが含まれていることを確認してください
public Student()
{
}