web-dev-qa-db-ja.com

JAX-RS Webサービスを介してJSONオブジェクトを送信しようとする「メディアタイプ= application / jsonのMessageBodyWriterが見つかりません」を取得

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アーカイブがあります。

どんな助けでも大歓迎です。

24
amedeo avogadro

クラスパスに Genson を追加すると、JSONサポートが自動的に有効になります。

Gensonは、jsonおよびJava/scala用のデータバインディングおよびストリーミングライブラリです。 JAX-RSの拡張ポイントMessageBodyReader/Writerを実装し、ジャージが自動的にGensonを検出し、Jsonの解析/書き込みに使用できるようにします。

GenaxsとJaxRSの統合 (jersey&cie)に関する詳細情報を見つけることができます。

52
eugen

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 にアクセスして、現在のバージョンを見つけてください。

9
kostja

JacksonJsonProvierクラスをクライアント構成に登録してからClientオブジェクトを作成します。これは私にとってはうまくいきました。以下はコードです。

    ClientConfig config = new ClientConfig();
    config.register(JacksonJsonProvider.class);
    Client client = ClientBuilder.newClient(config);
5
lakshmanas

これが問題の解決方法です。

ジャクソンを使用しました。これらのjarを追加しました enter image description here

このクラスを私のプロジェクトに追加しました。コードの重要な行には重要マークが付いています。

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);

}

}
4
bickster

私の根本原因はわずかに異なっていました。 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。

2
jFrenetic

必要なすべてのジャクソンジャーを追加することにより、私にとってはうまくいきました。これらのjarを追加しました

  • jackson-annotations-2.8.7.jar、
  • jackson-core-2.8.7.jar
  • jackson-databind-2.8.7.jar
  • jackson-jaxrs-base-2.8.7.jar
  • jackson-jaxrs-json-provider-2.8.3.jar
  • jackson-module-jaxb-annotations-2.8.7.jar
0
Hemant Daga

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
}
0
Rod SolPar