兼容MIME媒体类型的已注册邮件正文阅读器有:application/json;charset=UTF-8
The registered message body readers compatible with the MIME media type are: application/json;charset=UTF-8
我在服务器端使用 Spring Rest API,在客户端使用 jersey API。
我正在创建一个屏幕,它将在其中获取最后 5 位客户兑换交易。
我从服务器端返回 RedeemTransactionDetails 列表并在客户端接受相同的列表。
I had debugged server side code it's returns the valid list,
and in client side response code is 200 , whereas while getting
entity i'm getting error from client side.
服务器端:
@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
这个问题是已知问题,Whosebug 中已经提供了各种答案。
现在我建议您按照一些建议来解决您的问题。
建议#1:
您可以在 pom.xml 文件中使用以下依赖项来添加 genson jar 文件
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>1.4</version>
</dependency>
可在以下位置找到文档:https://owlike.github.io/genson/
然后清理您的项目并构建,然后 运行。
资源Link:
建议#2:
您可以在 pom.xml 文件中添加 jersy bundle jar 文件。
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-bundle</artifactId>
<version>1.19.3</version>
</dependency>
这有时也能解决问题。
资源Link:
建议#3:
检查您的实体是否包含 @XmlRootElement
注释。如果没有,请补充。
资源Link:
建议#4:
jonbros suggested that instead of using the assembly plugin for maven
use the shade plugin!
You can read Read problem and full solution from here:
http://jersey.576304.n2.nabble.com/issue-with-POST-when-packaging-into-jar-td5460103.html
资源Link:
该错误表明 JerseyClient 可能未正确配置以扫描提供程序包。检查您的 web.xml 是否 'jersey.config.server.provider.packages' 属性 配置为包括 'com.prom.via.rest.dto' 包含您的 JAXB 类.
的包
<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 注释进行注释。
我在服务器端使用 Spring Rest API,在客户端使用 jersey API。
我正在创建一个屏幕,它将在其中获取最后 5 位客户兑换交易。
我从服务器端返回 RedeemTransactionDetails 列表并在客户端接受相同的列表。
I had debugged server side code it's returns the valid list, and in client side response code is 200 , whereas while getting entity i'm getting error from client side.
服务器端:
@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
这个问题是已知问题,Whosebug 中已经提供了各种答案。
现在我建议您按照一些建议来解决您的问题。
建议#1:
您可以在 pom.xml 文件中使用以下依赖项来添加 genson jar 文件
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>1.4</version>
</dependency>
可在以下位置找到文档:https://owlike.github.io/genson/
然后清理您的项目并构建,然后 运行。
资源Link:
建议#2:
您可以在 pom.xml 文件中添加 jersy bundle jar 文件。
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-bundle</artifactId>
<version>1.19.3</version>
</dependency>
这有时也能解决问题。
资源Link:
建议#3:
检查您的实体是否包含 @XmlRootElement
注释。如果没有,请补充。
资源Link:
建议#4:
jonbros suggested that instead of using the assembly plugin for maven use the shade plugin!
You can read Read problem and full solution from here: http://jersey.576304.n2.nabble.com/issue-with-POST-when-packaging-into-jar-td5460103.html
资源Link:
该错误表明 JerseyClient 可能未正确配置以扫描提供程序包。检查您的 web.xml 是否 'jersey.config.server.provider.packages' 属性 配置为包括 'com.prom.via.rest.dto' 包含您的 JAXB 类.
的包<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 注释进行注释。