Как прочитать объект данных с помощью фабричного метода из тела JSON в запросе REST в JAX-RS?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как прочитать объект данных с помощью фабричного метода из тела JSON в запросе REST в JAX-RS?

Сообщение Anonymous »

В службе Java REST, использующей JAX-RS (Jersey 3.1.1, Jackson 2.14.2), у меня есть неизменяемый объект данных, например:

Код: Выделить всё

public class MyDataObj {
private int a;
public static MyDataObj valueOf(String jsonStr) {
return new MyDataObj(new ObjectMapper().readTree(jsonStr).get("a").asInt());
}
public MyDataObj(int a) { this.a = a; }
public int getA() { return a; }
}
Я хочу прочитать его из тела запроса JSON. В приведенном выше примере для краткости пропущена проверка ошибок и т. д. Это метод службы, который пытается прочитать тело запроса:

Код: Выделить всё

@POST
@Path("/myService")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response myService(MyDataObj serviceBody) {
String msg = doSomethingMeaningfulWith(serviceBody.getA());
return Response.ok().entity("{ \"result\": \"" + msg + "\" }");
}
Вызов службы с типом контента «application/json» и телом { «a»: 42 завершается с ошибкой HTTP 415 «Неподдерживаемый тип носителя». Исключение составляет

Код: Выделить всё

org.eclipse.persistence.exceptions.JAXBException Exception Description: The class MyDataObj requires a zero argument constructor or a specified factory method.  Note that non-static inner classes do not have zero argument constructors and are not supported.
Приведенный выше код будет успешным, если я аннотирую параметр "serviceBody" либо с помощью @HeaderParam (и отправляю данные в заголовке запроса), либо с помощью @QueryParam (отправка данных в запросе GET), поскольку JAX-RS указывает, что вы можете создавать свои объекты из JSON самостоятельно, используя статический метод "valueOf", принимая в качестве параметра одну "String" вместо использования конструкторов по умолчанию и сеттеры.
Но статический метод "valueOf" не будет вызываться в приведенном выше примере.
Теперь вопрос: как я могу зарегистрировать " фабричный метод» где-то будет создавать объект? Или есть какой-то альтернативный способ?

Подробнее здесь: https://stackoverflow.com/questions/790 ... -rest-requ
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»