web-dev-qa-db-ja.com

MIMEメディアタイプと互換性のある登録済みのメッセージ本文リーダーは次のとおりです。application/ json; charset = UTF-8

サーバー側でSpring Rest API、クライアント側でjersey APIを使用しています。

私は、最後の5件の顧客利用トランザクションを取得する画面を作成しています。

サーバー側から私はRedeemTransactionDetailsのリストを返し、クライアント側で同じものを受け入れます。

私はサーバー側のコードをデバッグしましたが、それは有効なリストを返し、クライアント側では応答コードは200ですが、エンティティーを取得しているときにクライアント側からエラーが発生します。

サーバ側:

    @RestController
    @RequestMapping("/rest/api")
    public class CustomerRestController {
            @Autowired private CustomerService customerService;

            @RequestMapping(value="/redeemTransactionList/{clientId}/{mobileNumber}/{numOfTransaction}" , method=RequestMethod.POST , produces = "application/json; charset=UTF-8")
            public @ResponseBody List<RedeemTransactionDetails> redeemTransaction(@PathVariable(value = "clientId") int clientId, @PathVariable(value = "mobileNumber") String mobileNumber , @PathVariable(value="numOfTransaction") int numOfTransaction) {
            LOG.debug("We are in redeemTransaction method for user {} " , clientId);
            List<RedeemTransactionDetails> redeemList = null ;
            try {
                redeemList =  customerService.redeemTransactionList(clientId, mobileNumber,numOfTransaction);

            } catch (Exception e) {
                LOG.debug("Excption while fetching redeemTransaction ");
            }
            return  redeemList;
        }
    }

クライアント側 :

public List<RedeemTransactionDetails> getRedeemTransactions(String mobileNumber, String clientId, String numberOfTransaction) {
    log.debug("inside authenticate() ");
    List<RedeemTransactionDetails> result = null; 
    try{
        webResource = client.resource(uri + "/redeemTransactionList").path(clientId).path(mobileNumber).path(numberOfTransaction) ;
        ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).post(ClientResponse.class);
        if (response.getStatus() != 200) {
            log.debug("response.getStatus() : " +  response.getStatus() );  
            throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
         } 
        response.getType() ;
        result = (List<RedeemTransactionDetails>) response.getEntity(RedeemTransactionDetails.class);
        log.debug("user Details " + result);
    }
    catch(Exception e){
        log.debug(e);
    }
    return result ;
}
}

注:pom xmlファイルで次の依存関係を使用しました

<dependency>
        <groupId>com.Sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.19.3</version>
    </dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.6</version>
</dependency>

編集:

エラーログ

SEVERE: A message body reader for Java class com.prom.via.rest.dto.RedeemTransactionDetails, and Java type class com.prom.via.rest.dto.RedeemTransactionDetails, and MIME media type application/json;charset=UTF-8 was not found
Feb 23, 2017 4:52:17 PM com.Sun.jersey.api.client.ClientResponse getEntity
SEVERE: The registered message body readers compatible with the MIME media type are:
*/* ->
  com.Sun.jersey.core.impl.provider.entity.FormProvider
  com.Sun.jersey.core.impl.provider.entity.StringProvider
  com.Sun.jersey.core.impl.provider.entity.ByteArrayProvider
  com.Sun.jersey.core.impl.provider.entity.FileProvider
  com.Sun.jersey.core.impl.provider.entity.InputStreamProvider
  com.Sun.jersey.core.impl.provider.entity.DataSourceProvider
  com.Sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
  com.Sun.jersey.core.impl.provider.entity.ReaderProvider
  com.Sun.jersey.core.impl.provider.entity.DocumentProvider
  com.Sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
  com.Sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
  com.Sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
  com.Sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
  com.Sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
  com.Sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
  com.Sun.jersey.core.impl.provider.entity.EntityHolderReader
11
light_ray

このエラーは、JerseyClientがプロバイダーパッケージをスキャンするように正しく設定されていない可能性があることを示しています。 「jersey.config.server.provider.packages」プロパティが、JAXBクラスを含む「com.prom.via.rest.dto」パッケージを含むように設定されている場合は、web.xmlを確認してください。

<servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
     <!-- Register resources and providers under com.prom.via.rest.dto package. -->
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.prom.via.rest.dto</param-value>
    </init-param>
</servlet>

また、SkyWalkerが示したように、RedeemTransactionDetailsに@XmlRootElementアノテーションが付いているかどうかを確認します。

3
VinPro

この問題は既知の問題であり、さまざまな回答がスタックオーバーフローですでに利用可能です。

今、私はあなたにあなたの問題を解決するためにいくつかの提案に従うことをお勧めしています。

提案#1:

Genson jarファイルを追加するには、pom.xmlファイルで次の依存関係を使用します

<dependency>
    <groupId>com.owlike</groupId>
    <artifactId>genson</artifactId>
    <version>1.4</version>
</dependency>

ドキュメントは次の場所にあります https://owlike.github.io/genson/

次に、プロジェクトをクリーンアップし、ビルドして実行します。

リソースリンク: https://stackoverflow.com/a/25754441/2293534

提案#2:

Jersyバンドルjarファイルをpom.xmlファイルに追加できます。

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-bundle</artifactId>
    <version>1.19.3</version>
</dependency>

これで問題が解決することもあります。

リソースリンク: https://stackoverflow.com/a/23192776/2293534

提案#3:

エンティティに@XmlRootElementアノテーションが含まれているかどうかを確認してください。そうでない場合は、追加してください。

リソースリンク: https://stackoverflow.com/a/7388605/2293534

提案#4:

jonbrosは、mavenのAssemblyプラグインを使用する代わりに、shadeプラグインを使用することを提案しました!

ここから読み取りの問題と完全な解決策を読むことができます: http://jersey.576304.n2.nabble.com/issue-with-POST-when-packaging-into-jar-td5460103.html

リソースリンク: https://stackoverflow.com/a/4955831/2293534

4
SkyWalker