Maillot Erreur: MessageBodyReader pas trouvé le type de support=application/json
je suis en train de mettre en œuvre un petit REPOS de l'API à l'aide de Jersey cadre, en principe, le code a bien fonctionné mais quand j'essaie de faire un " GET " d'une table de hachage, j'obtiens l'erreur suivante:
nov 23, 2014 4:27:40 PM org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor aroundReadFrom
GRAVE: MessageBodyReader not found for media type=application/json, type=interface java.util.Map, genericType=java.util.Map<upf.dad.proyecto.New, upf.dad.proyecto.Term>.
1440 [DefaultQuartzScheduler_Worker-3] ERROR org.quartz.core.JobRunShell - Job DEFAULT.testJob3 threw an unhandled Exception:
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/json, type=interface java.util.Map, genericType=java.util.Map<upf.dad.proyecto.New, upf.dad.proyecto.Term>.
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:230)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:154)
at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1124)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:851)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:810)
)
at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:313)
at upf.dad.proyecto.HotTopicDetector.News(HotTopicDetector.java:110)
at upf.dad.proyecto.ScheduledTestJob3.execute(ScheduledTestJob3.java:11)
1440 [DefaultQuartzScheduler_Worker-3] ERROR org.quartz.core.ErrorLogger - Job (DEFAULT.testJob3 threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/json, type=interface java.util.Map, genericType=java.util.Map<upf.dad.proyecto.New, upf.dad.proyecto.Term>.]
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/json, type=interface java.util.Map, genericType=java.util.Map<upf.dad.proyecto.New, upf.dad.proyecto.Term>.
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:230)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:154)
at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1124)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:851)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:810)
at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:368)
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:846)
at org.glassfish.jersey.client.JerseyInvocation.access$600(JerseyInvocation.java:91)
at org.glassfish.jersey.client.JerseyInvocation$3.call(JerseyInvocation.java:705)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:424)
at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:701)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:417)
at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:313)
at upf.dad.proyecto.HotTopicDetector.News(HotTopicDetector.java:110)
at upf.dad.proyecto.ScheduledTestJob3.execute(ScheduledTestJob3.java:11)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
... 1 more
C'est la problématique de la ligne:
Client client = ClientBuilder.newClient();
WebTarget targetGetAllNews = client.target("http://localhost:15000").path("news/getAllNews");
Map<New, Term> NewsAll = targetGetAllNews.request(
MediaType.APPLICATION_JSON_TYPE).get(new GenericType<Map<New, Term>>(){});
et c'est ainsi que j'ai mis en place le service:
@GET
@Path("/getAllNews")
@Produces(MediaType.APPLICATION_JSON)
public Map<New, Term> getAllNews() {
return NewsCrawler.getNewAndTerm();
}
pom.xml (les dépendances maven)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>upf.dad.proyecto</groupId>
<artifactId>JAXRS-proyecto</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- Rome RSS and Atom utilities @ http://rometools.github.io/rome/-->
<dependency>
<groupId>rome</groupId>
<artifactId>rome</artifactId>
<version>1.0</version>
</dependency>
<!-- jsoup HTML parser library @ http://jsoup.org/-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.twitter4j</groupId>
<artifactId>twitter4j-core</artifactId>
<version>4.0.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.12</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-jdk-http</artifactId>
<version>2.12</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.12</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.12</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.13</version>
</dependency>
</dependencies>
</project>
Côté serveur de configuration:
public class NewsCrawlerRestServer {
public static void main(String[] args) throws IOException {
URI baseUri = UriBuilder.fromUri("http://localhost/").port(15000).build();
ResourceConfig config = new ResourceConfig(NewsCrawlerServices.class, HotTopicDetectorServices.class);
config.register(JacksonFeature.class);
HttpServer server = JdkHttpServerFactory.createHttpServer(baseUri, config);
System.out.println("Server started...");
}
}
Erreur d'inscription de Jackson dans le client:
org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: javax.ws.rs.ProcessingException: Error reading entity from input stream.]
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: javax.ws.rs.ProcessingException: Error reading entity from input stream.
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:866)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:810)
at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:368)
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:846)
at org.glassfish.jersey.client.JerseyInvocation.access$600(JerseyInvocation.java:91)
at org.glassfish.jersey.client.JerseyInvocation$3.call(JerseyInvocation.java:705)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:424)
at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:701)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:417)
at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:313)
at upf.dad.proyecto.HotTopicDetector.News(HotTopicDetector.java:112)
at upf.dad.proyecto.ScheduledTestJob3.execute(ScheduledTestJob3.java:11)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
... 1 more
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not find a (Map) Key deserializer for type [simple type, class upf.dad.proyecto.New]
at com.fasterxml.jackson.databind.deser.DeserializerCache._handleUnknownKeyDeserializer(DeserializerCache.java:580)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findKeyDeserializer(DeserializerCache.java:170)
at com.fasterxml.jackson.databind.DeserializationContext.findKeyDeserializer(DeserializationContext.java:404)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.createContextual(MapDeserializer.java:232)
at com.fasterxml.jackson.databind.DeserializationContext.handleSecondaryContextualization(DeserializationContext.java:572)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:386)
at com.fasterxml.jackson.databind.ObjectReader._findRootDeserializer(ObjectReader.java:1380)
at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1228)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:677)
at com.fasterxml.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:777)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:264)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:234)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:154)
at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1124)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:851)
Nouvelle Classe:
package upf.dad.proyecto;
import java.util.Date;
public class New {
private String tittle;
private String description;
private Date date;
private String link;
public New(){
}
public New(String t, String d, Date date, String l){
this.tittle = t;
this.description = d;
this.date = date;
this.link = l;
}
public String getTittle() {
return tittle;
}
public void setTittle(String tittle) {
this.tittle = tittle;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
@Override
public String toString() {
return "New [tittle=" + tittle + ", description=" + description
+ ", date=" + date + ", link=" + link + "]";
}
}
Terme de classe:
package upf.dad.proyecto;
public class Term {
private String word;
public Term(){
}
public Term(String word){
this.word = word;
}
public String getWord(){
return word;
}
public void setWord(String _word){
word = _word;
}
@Override
public String toString() {
return "Termino =" + word + "]";
}
}
quelqu'un peut m'aider s'il vous plaît retourner la carte?
Je sais que c'est un problème, mais pouvez-vous montrer le serveur de configuration de l'application
OriginalL'auteur Gera | 2014-11-23
Vous devez vous connecter pour publier un commentaire.
Je vois que vous avez deux de fournisseur de dépendances
jersey-media-moxy
etjersey-media-json-jackson
. J'ai toujours eu un problème avecMaps
avec MOXy. Je suppose qu'ils ne jouent pas bien. Semble que vous aurez besoin d'utiliser un adaptateur pour le faire jouer à nice, comme on le voit ici de Blaise Doughan.Cela étant dit, j'ai demandé (dans les commentaires ci-dessus) pour voir votre Serveur de configuration côté, comme MOXy s'auto configurer lui-même, et prévalent sur les
jersey-media-json-jackson
. Pourquoi, je ne suis pas sûr, c'est juste ce que j'ai toujours connu. Donc, je suis curieux de voir comment le Serveur n'a pas manqué avant même que la réponse vint de nouveau au client. À moins que vous confgiure laJacksonFeature
avec le serveur d'application, dans lequel vous avez également configuré avec le client. (C'est le cas, car vous avez aussi MOXy de la dépendance).De toute façon, si vous ne voulez pas passer par les tracas de la création de cartes, comme on le voit dans le lien ci-dessus, simplement se débarrasser de la
jersey-media-moxy
de dépendance.jersey-media-json-jackson
sera également l'auto configurer la fonctionnalité. Vous devez simplement utiliser l'un ou l'autre.En aparté:
@Path("/getAllNews")
. Chemin des segments doivent être des noms, sauf s'ils sont contrôleur de ressources, qui normalement effectuer une action, autres que les opérations CRUD (par exemple/register
). La méthode HTTP déjà se compose du verbe à laquelle chaque CRUD action doit être effectuée.Juste quelques sémantique à considérer 🙂
Mise à JOUR
Le problème est avec le
New
clé. Jackson ne sais pas comment désérialiser. Depuis que vous êtes prêt wot interrupteur de la clé et le type de la valeur, il suffit de changer ont latoString
retour de laname
dans leTerm
classe, et il devrait être ok.Essayez de vous enregistrer avec le client, car le problème est du côté client (puisque le problème est avec le client), à savoir que
client.register(...)
. Puisque vous avez le MOXy encore, le client peut être implicitement inscrite avec MOXy.merci pour l'aide, encore une fois, j'ai mis à jour le post avec l'erreur que j'obtiens lorsque j'enregistre le client..., je considère également utiliser l'adaptateur, mais je ne sais pas comment la mettre en œuvre.
s'il vous plaît montrer la
New
etTerm
classe. J'ai créé mon propre pour tester et cela a bien fonctionné.Vous pouvez voir les classes demandé, merci. Pourriez-vous nous donner un exemple de comment utiliser
GenericEntity
?OriginalL'auteur Paul Samsotha