JAX-RS Webサービスを介してJSONオブジェクトを送信しようとしています。私のファイルweb.xmlは:
<servlet>
<description>JAX-RS Tools Generated - Do not modify</description>
<servlet-name>JAX-RS Servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>it.notifire</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>JAX-RS Servlet</servlet-name>
<url-pattern>/jaxrs/*</url-pattern>
</servlet-mapping>
送信するオブジェクトをモデル化するクラスは次のとおりです。
public class GPSCoordinate {
private float latitudine;
private float longitudine;
public float getLatitudine() {
return latitudine;
}
public void setLatitudine(float latitudine) {
this.latitudine = latitudine;
}
public float getLongitudine() {
return longitudine;
}
public void setLongitudine(float longitudine) {
this.longitudine = longitudine;
}
}
ルートクラスリソースは次のとおりです。
@Path("position")
public class Position {
@Context
private UriInfo context;
@GET
@Produces(MediaType.APPLICATION_JSON)
public GPSCoordinate getHTML() {
GPSCoordinate coord = new GPSCoordinate();
coord.setLatitudine(90.45f);
coord.setLongitudine(34.56f);
return coord;
}
}
今、サービスにアクセスしようとすると、ブラウザに次のリンクが表示されます
http://localhost:8080/Notifire/jaxrs/position
そして、私は次のエラーが表示されます:
メッセージorg.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:メディアタイプ= application/jsonのMessageBodyWriterが見つかりません
WEB-INF/libフォルダーには、jersey JAX-RS実装の最後のリリース(jaxrs-ri-2.5.jar)とjersey-json.jarアーカイブがあります。
どんな助けでも大歓迎です。
クラスパスに Genson を追加すると、JSONサポートが自動的に有効になります。
Gensonは、jsonおよびJava/scala用のデータバインディングおよびストリーミングライブラリです。 JAX-RSの拡張ポイントMessageBodyReader/Writerを実装し、ジャージが自動的にGensonを検出し、Jsonの解析/書き込みに使用できるようにします。
GenaxsとJaxRSの統合 (jersey&cie)に関する詳細情報を見つけることができます。
Jerseyは「自動検出可能な」機能をサポートし、JSONサポートもその1つです。有効にするには、 ドキュメント に従って、互換性のあるライブラリをパスに追加する必要があります
ただし、推奨されるjersey-media-json-processing
私の場合、何らかの理由でライブラリが認識されませんでした、jersey-media-moxy
は次のとおりです。
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.15</version>
</dependency>
執筆時点では2.15が最新バージョンです。 maven central artifact page にアクセスして、現在のバージョンを見つけてください。
JacksonJsonProvierクラスをクライアント構成に登録してからClientオブジェクトを作成します。これは私にとってはうまくいきました。以下はコードです。
ClientConfig config = new ClientConfig();
config.register(JacksonJsonProvider.class);
Client client = ClientBuilder.newClient(config);
これが問題の解決方法です。
ジャクソンを使用しました。これらのjarを追加しました
このクラスを私のプロジェクトに追加しました。コードの重要な行には重要マークが付いています。
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; <-- IMPORTANT
import Java.util.HashSet;
import Java.util.Set;
import javax.ws.rs.core.Application;
//@javax.ws.rs.ApplicationPath("webresources")
public class MyApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new Java.util.HashSet<Class<?>>();
//addRestResourceClasses(resources);
//resources.add(MultiPartFeature.class);
//resources.add(JettisonFeature.class);
return resources;
}
@Override
public Set<Object> getSingletons() {
final Set<Object> instances = new HashSet<Object>();
instances.add(new JacksonJsonProvider()); <--------- IMPORTANT
return instances;
}
/**
* Do not modify addRestResourceClasses() method.
* It is automatically populated with
* all resources defined in the project.
* If required, comment out calling this method in getClasses().
*/
private void addRestResourceClasses(Set<Class<?>> resources) {
//resources.add(org.glassfish.jersey.media.multipart.MultiPartProperties.Feature.MultiPartContextResolver.class);
//resources.add(org.glassfish.jersey.media.multipart.MultiPartProperties.Feature.MultiPartContextResolver.class);
}
}
私の根本原因はわずかに異なっていました。 Jerseyのソースコードのデバッグに少し時間を費やしましたが、JAXBクラスにデフォルトコンストラクターがないため、JAXBContext
の構築に失敗しました。適切なMessageBodyWriterの検索中に発生しますが、例外は処理されません。
対応するコードスニペット(MOXyJsonProvider:324)は次のとおりです。
try {
Set<Class<?>> domainClasses = getDomainClasses(genericType);
return getJAXBContext(domainClasses, annotations, mediaType, null);
} catch(JAXBException e) {
return null;
}
したがって、POMにMoxy JSON依存関係がある場合は、JAXBクラスが有効であることを再確認してください。
使用しているバージョン:Jersey 2.19、Moxy 2.6.0。
必要なすべてのジャクソンジャーを追加することにより、私にとってはうまくいきました。これらのjarを追加しました
https://jersey.Java.net/documentation/2.5.1/user-guide.html#json に移動します
クラスを完了する必要があります。..JAXBが必要とする例:
@XmlRootElement
public class MyJaxbBean {
@XmlElement(name="king")
public String name;
@XmlTransient
public int age;
// several lines removed
}