JAX-RS commence à utiliser et j’ai écrit un exemple d’application qui génère un objet json. mais je reçois une exception. Voici mon code:
@Path("/hello")
public class HelloWorldService {
@GET
@Path("/query/{artist_id}")
@Produces("application/json")
public Data getMsg(@PathParam("artist_id") int artist_id,
@QueryParam("from") int from,
@QueryParam("to") int to) {
Data d=new Data();
d.setName("Mateen");
d.setRoll(77);
return d;
}
}
Mes données sont simplement une classe POJO:
@XmlRootElement
public class Data {
private int roll;
private String name;
public int getRoll() {
return roll;
}
public void setRoll(int roll) {
this.roll = roll;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Je reçois une exception:
javax.ws.rs.WebApplicationException:
com.Sun.jersey.api.MessageException:
A message body writer for Java class com.abc.data.Data,
and Java type class com.abc.data.Data,
and MIME media type application/json was not found
Qu'est-ce que je fais mal ?
J'ai enfin trouvé ma réponse. J'ai ajouté
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.8</version>
</dependency>
dans mon fichier pom.xml. Puis j'ai ajouté
<init-param>
<param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
à mon fichier web.xml, et tout fonctionne bien. Aucun changement n'était requis pour mon code ci-dessus.
J'ai ajouté les pots suivants et cela a fonctionné pour moi
Juste un petit ajout. Si vous n'utilisez pas le fichier descripteur web.xml, vous pouvez activer le programme POJOMappingFeatire comme indiqué ci-dessous.
...
final ResourceConfig rc = new PackagesResourceConfig("com.test.resources");
final Map<String, Object> config = new HashMap<String, Object>();
config.put("com.Sun.jersey.api.json.POJOMappingFeature", true);
rc.setPropertiesAndFeatures(config);
...
<!-- For Jersey -->
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.15</version>
</dependency>
<!-- For JSON -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.15</version>
</dependency>
La sortie XML est prise en charge par défaut. Donc, pas de dépendance nécessaire pour cela.
En travaillant avec Jersey 1.8, je rencontrais la même erreur lors de la création d'un objet JSON et de la frappe d'une API REST du côté client.
Si vous êtes confronté à un problème côté serveur, assurez-vous que vous avez correctement inclus jersey-json.jar dans classpath et mappé le paramètre init-param correct dans web.xml, comme indiqué dans d'autres réponses.
Conformément à documentation Jersey 1.8 , l'extrait suivant montre comment utiliser la fonctionnalité de mappage POJO JSON côté client:
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,Boolean.TRUE);
Client client = Client.create(clientConfig);
J'ai eu le même problème: un écrivain de corps de message pour le type Java, classe Java.lang.String et le type de support MIME, application/json] est introuvable.
Le problème était que la classe javax.ws.rs.ext.MessageBodyWriter était extraite de
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.22.2</version>
</dependency>
Était en collision avec la même classe de:
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19.1</version>
</dependency>