2010-04-23 2 views
26

У меня есть ресурс JAX-RS, который получает свои Счетчики в виде строки JSON как это:Преобразование JSON параметры запроса к объектам с JAX-RS

http://some.test/aresource?query={"paramA":"value1", "paramB":"value2"} 

Причина использования JSON здесь, является то, что запрос объект может быть довольно сложным в реальных случаях использования.

Я хотел бы преобразовать строку JSON в объект Java, DTO в примере:

@GET 
@Produces("text/plain") 
public String getIt(@QueryParam("query") DataTransferObject dto) { 
    ... 
} 

Поддерживает ли JAX-RS такого преобразования из JSON передается как пары запросов к объектам Java?

ответ

15

Да, вы можете это сделать, но вам нужно будет написать код конверсии самостоятельно. К счастью, это просто, вам просто нужно написать класс, который имеет публичный конструктор String для преобразования. Например:

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

Затем вы можете использовать:

@GET 
@Produces("text/plain") 
public String getIt(@QueryParam("query") JSONParam json) { 
    DataTransferObject dto = json.getDTO(); 
    ... 
} 
+4

Поскольку все это кажется, что «JSONParam» делает это обернуть «DataTransferObject» и использовать строку конструктор на основе ... будет можно просто добавить конструктор String в «DataTransferObject»? – hypno7oad

8

Добавление к решению Джейсона, используя http://www.json.org/java/ (любезно 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; 
    }     
} 

Не изобретайте колесо :-)

+0

Если вы не передаете свой объект JSON через параметр, вы не можете использовать это решение. Но вы можете использовать версию, которую предлагает лилия ([lili] (http://stackoverflow.com/a/6250744/853510)) –

11

Как уже упоминалось, вам необходимо явно преобразовать из параметра String в JSON. Но нет необходимости использовать что-то примитивное, как парсер org.json; Jackson или Gson могут выполнять привязку данных (String to JSON, JSON к POJO) в строке или двух. С Джексон:

MyValue value = new ObjectMapper().readValue(json, MyValue.class); 

(для производства кода, просто создать ObjectMapper один раз как статический член, повторное использование)

Джексон является то, что реализация большинства JAX-RS использовать для реализации привязки данных для данных POST, так что это довольно похожи.

0

Если вы заинтересованы в создании своих DTO, могу ли я предложить jsonschema2pojo? Вы можете определить свои объекты с помощью JSON Schema и автоматически создать ваши DTO.

После того, как вы написали схему, вы также можете предоставить ее своим потребителям, чтобы они точно понимали, как следует отформатировать запросы.

4

JAX-RS поддерживает использование JAXB (Java API для привязки XML) для привязки JavaBean к XML или JSON и наоборот. Более подробную информацию можно найти здесь, например: http://www.ibm.com/developerworks/web/library/wa-aj-tomcat/index.html

Вы должны

  • Добавить @XmlRootElement аннотацию DataTransferObject
  • Создайте его пустой конструктор по умолчанию в DataTransferObject
  • Добавить @Consumes (MEDIATYPE.APPLICATION_JSON) аннотацию к вашему WebService
+0

Если вам нужен пример, см. [Https://blogs.oracle.com/enterprisetechtips /entry/configuring_json_for_restful_web](https://blogs.oracle.com/enterprisetechtips/entry/configuring_json_for_restful_web) искать StatusInfoBean. –

Смежные вопросы