Преобразуйте параметры запроса JSON в объекты с помощью JAX-RS - PullRequest
27 голосов
/ 23 апреля 2010

У меня есть ресурс 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, переданного как запросparam для объектов Java?

Ответы [ 6 ]

15 голосов
/ 23 апреля 2010

Да, вы можете сделать это, но вам нужно будет написать код конвертации самостоятельно. К счастью, это легко, вам просто нужно написать класс, который имеет открытый конструктор 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();
    ...
}
11 голосов
/ 07 января 2011

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

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

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

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

8 голосов
/ 07 января 2011

Добавление к решению Джейсона, используя http://www.json.org/java/ (любезно предоставлено Крокфордом):

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

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

4 голосов
/ 06 июня 2011

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) в свой веб-сервис
0 голосов
/ 07 декабря 2016

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

BeanUtils.copyProperties(source, target)
0 голосов
/ 20 февраля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...