Преобразование параметров запроса JSON в объекты с помощью JAX-RS

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

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?


person deamon    schedule 23.04.2010    source источник


Ответы (6)


Да, вы можете это сделать, но вам нужно будет написать код конвертации самостоятельно. К счастью, это несложно, вам просто нужно написать класс с общедоступным конструктором 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();
    ...
}
person Jason Day    schedule 23.04.2010
comment
Поскольку кажется, что все, что делает «JSONParam», это обертка «DataTransferObject» и использование конструктора на основе String... можно ли просто добавить конструктор на основе String в «DataTransferObject»? - person hypno7oad; 07.05.2012
comment
Вы можете узнать больше о преобразовании параметров в документации Джерси. - person deamon; 11.06.2018

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

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

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

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

person StaxMan    schedule 07.01.2011

Добавление к решению Джейсона с помощью 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;
    }                  
}

Не изобретайте велосипед :-)

person Mike K    schedule 07.01.2011
comment
Если вы не передадите свой объект JSON через параметр, вы не сможете использовать это решение. Но вы можете использовать версию, которую предлагает lili (lili) - person Tobias Sarnow; 06.08.2012

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) к вашему веб-сервису.
person lili    schedule 06.06.2011
comment
Если вам нужен пример, см. https://blogs.oracle.com/enterprisetechtips/entry/configuring_json_for_restful_web найдите StatusInfoBean. - person Tobias Sarnow; 06.08.2012

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

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

person joelittlejohn    schedule 20.02.2011

Возможно, вы могли бы использовать http://docs.spring.io/spring-framework/docs/2.5.x/api/org/springframework/beans/BeanUtils.html

BeanUtils.copyProperties(source, target)
person Yaroslav    schedule 06.12.2016