web-dev-qa-db-fra.com

Convertir des paramètres de requête JSON en objets avec JAX-RS

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?

27
deamon

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();
    ...
}
15
Jason Day

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.

11
StaxMan

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 :-)

8
Mike K

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

  • Ajouter une annotation @XmlRootElement sur DataTransferObject
  • Créez-le un constructeur par défaut vide dans DataTransferObject
  • Ajoutez une annotation @Consumes (MediaType.APPLICATION_JSON) à votre WebService
4
lili

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)
0
Yaroslav

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.

0
joelittlejohn