J'ai une ressource JAX-RS, qui obtient ses paramètres comme une chaîne JSON comme ceci:
http://some.test/aresource?query={"paramA":"value1", "paramB":"value2"}
La raison d'utiliser JSON ici, c'est que l'objet de requête peut être assez complexe dans des cas d'utilisation réels.
Je voudrais convertir la chaîne JSON en un Java, dto dans l'exemple:
@GET
@Produces("text/plain")
public String getIt(@QueryParam("query") DataTransferObject dto ) {
...
}
JAX-RS prend-il en charge une telle conversion à partir de JSON passée en tant que paramètre de requête aux objets Java?
Oui, vous pouvez le faire, mais vous devrez écrire le code de conversion vous-même. Heureusement, c'est facile, il vous suffit d'écrire une classe qui a un constructeur public String
pour effectuer la conversion. Par exemple:
public class JSONParam {
private DataTransferObject dto;
public JSONParam(String json) throws WebApplicationException {
try {
// convert json string DataTransferObject and set dto
}
catch (JSONException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST)
.entity("Couldn't parse JSON string: " + e.getMessage())
.build());
}
}
public DataTransferObject getDTO() {
return dto;
}
}
Ensuite, vous pouvez utiliser:
@GET
@Produces("text/plain")
public String getIt(@QueryParam("query") JSONParam json) {
DataTransferObject dto = json.getDTO();
...
}
Comme mentionné, vous devez convertir explicitement le paramètre String en JSON. Mais il n'est pas nécessaire d'utiliser quelque chose d'aussi primitif que l'analyseur org.json; Jackson ou Gson peut effectuer une liaison de données (chaîne vers JSON, JSON vers POJO) sur une ligne ou deux. Avec Jackson:
MyValue value = new ObjectMapper().readValue(json, MyValue.class);
(pour le code de production, créez simplement ObjectMapper une fois en tant que membre statique, réutilisez)
Jackson est ce que la plupart des implémentations JAX-RS utilisent pour implémenter la liaison de données pour les données POST, donc c'est assez similaire.
Ajout à la solution de Jason, en utilisant http://www.json.org/Java/ (avec la permission de Crockford):
import org.json.JSONObject;
public class JSONParam {
private DataTransferObject dto;
public JSONParam(String json) throws WebApplicationException {
try {
// convert json string DataTransferObject and set dto
JSONObject jo = new JSONObject(json);
dto.setParamA(jo.getString("paramA"));
dto.setParamB(jo.getString("paramB"));
// There are other get methods for Integer, Double, etc.
// You can also build JSON from Java objects.
}
catch (JSONException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST)
.entity("Couldn't parse JSON string: " + e.getMessage())
.build());
}
}
public DataTransferObject getDTO() {
return dto;
}
}
Ne réinventez pas la roue :-)
JAX-RS prend en charge l'utilisation de JAXB (API Java pour la liaison XML) pour lier un JavaBean à XML ou JSON et vice versa. Plus de détails peuvent être trouvés ici, par exemple: http://www.ibm.com/developerworks/web/library/wa-aj-Tomcat/index.html
Tu dois
Vous pourriez peut-être utiliser http://docs.spring.io/spring-framework/docs/2.5.x/api/org/springframework/beans/BeanUtils.html
BeanUtils.copyProperties(source, target)
Si vous êtes intéressé à générer vos DTO, puis-je suggérer jsonschema2pojo ? Vous pouvez définir vos objets à l'aide de Schéma JSON et faire générer automatiquement vos DTO.
Une fois que vous avez écrit le schéma, vous pouvez également le donner à vos consommateurs afin qu'ils comprennent exactement comment les demandes doivent être formatées.