web-dev-qa-db-fra.com

Les lecteurs de corps de message enregistrés compatibles avec le type de média MIME sont: application / json; charset = UTF-8

J'utilise l'API Spring Rest côté serveur et l'API jersey côté client.

Je crée un écran où il récupérera les 5 dernières transactions d'échange de clients.

Du côté du serveur, je renvoie la liste des RedeemTransactionDetails et j'accepte la même chose du côté client.

J'avais débogué le code côté serveur, il renvoie la liste valide, et dans le code de réponse côté client est 200, tandis que lors de l'obtention de l'entité, je reçois une erreur du côté client.

Du côté serveur:

    @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;
        }
    }

Côté client :

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

REMARQUE: j'avais utilisé les dépendances suivantes dans le fichier 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>

ÉDITER:

JOURNAL DES ERREURS

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

L'erreur indique que JerseyClient n'a peut-être pas été configuré correctement pour analyser les packages du fournisseur. Vérifiez votre web.xml si la propriété "jersey.config.server.provider.packages" est configurée pour inclure le package "com.prom.via.rest.dto" qui contient vos classes 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>

En outre, comme SkyWalker l'a indiqué, vérifiez si RedeemTransactionDetails est annoté avec l'annotation @XmlRootElement ou non.

3
VinPro

Ce problème est connu et diverses réponses sont déjà disponibles dans stackoverflow.

Maintenant, je vous suggère de suivre quelques suggestions pour résoudre votre problème.

Suggestion # 1:

Vous pouvez ajouter un fichier jar genson en utilisant la dépendance suivante dans votre fichier pom.xml

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

La documentation peut être trouvée à: https://owlike.github.io/genson/

Ensuite, nettoyez votre projet et générez puis exécutez.

Lien de ressource: https://stackoverflow.com/a/25754441/2293534

Suggestion # 2:

Vous pouvez ajouter le fichier jar bundle jersy dans votre fichier pom.xml.

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

Cela peut également parfois résoudre le problème.

Lien de ressource: https://stackoverflow.com/a/23192776/2293534

Suggestion # 3:

Vérifiez que votre droit contient @XmlRootElement annotations ou non. Sinon, veuillez l'ajouter.

Lien de ressource: https://stackoverflow.com/a/7388605/2293534

Suggestion # 4:

jonbros a suggéré qu'au lieu d'utiliser le plugin Assembly pour maven, utilisez le plugin shadow!

Vous pouvez lire le problème de lecture et la solution complète à partir d'ici: http://jersey.576304.n2.nabble.com/issue-with-POST-when-packaging-into-jar-td5460103.html

Lien de ressource: https://stackoverflow.com/a/4955831/2293534

4
SkyWalker