サーバー側で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
このエラーは、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アノテーションが付いているかどうかを確認します。
この問題は既知の問題であり、さまざまな回答がスタックオーバーフローですでに利用可能です。
今、私はあなたにあなたの問題を解決するためにいくつかの提案に従うことをお勧めしています。
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
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
エンティティに@XmlRootElement
アノテーションが含まれているかどうかを確認してください。そうでない場合は、追加してください。
リソースリンク: https://stackoverflow.com/a/7388605/2293534
jonbrosは、mavenのAssemblyプラグインを使用する代わりに、shadeプラグインを使用することを提案しました!
ここから読み取りの問題と完全な解決策を読むことができます: http://jersey.576304.n2.nabble.com/issue-with-POST-when-packaging-into-jar-td5460103.html