Используя RestEasy, при необходимости передайте параметр как JSON в POST

У меня есть следующая конечная точка REST:

@POST
@Path("/id/{id}/doSomething")
@Produces({ MediaType.APPLICATION_JSON })
@Consumes({ MediaType.APPLICATION_JSON })
public Response doSomething(@PathParam("id") final String id, MyObject foo) {
    // does some stuff; checks for a null foo and handles it
}

Класс MyObject имеет одно поле String с именем justification.

Я хотел бы иметь возможность подключиться к этой конечной точке вообще без содержимого или с помощью JSON, который соответствует классу MyObject. Я бы хотел работать любым способом. Другими словами, foo может быть создан, или foo может иметь значение null; У меня есть код для обработки обоих случаев.

Проблема в том, что содержимое JSON кажется обязательным для этой конечной точки, а не необязательным. Поэтому во время тестирования я должен отправить JSON на конечную точку, иначе я получаю ошибку 500. Даже если этот JSON всего лишь {} (я также могу отправить { justification: "blah blah" }, и это тоже работает). Но отправка вообще без содержания приводит к неудачному вызову; никогда даже не попадает в конечную точку.

Итак, у меня вопрос: как я могу настроить эту конечную точку, чтобы я мог отправлять на нее POST без какого-либо содержимого или с JSON в теле, которое сопоставляется с foo, и работать в любом случае?

В конечном итоге мне просто нужен способ, чтобы пользователь мог отправить обоснование на эту конечную точку, но не обязан. И поскольку обоснования могут быть длинными, я не могу использовать его как параметр запроса или параметр пути.

Спасибо!


person MegaMatt    schedule 24.09.2015    source источник


Ответы (2)


Вы не сможете попасть в endpoint вообще без содержания, потому что ваш endpoint говорит @Consumes({MediaType.APPLCIATION_JSON}). Кроме того, при попытке POST к классу при использовании веб-службы должен быть какой-то контент. Как вы сказали, даже если это NULL или {}, это не имеет значения, пока в него поступает какой-то контент. Отсутствие передачи контента в службу работает только тогда, когда вы делаете запрос GET. Для всех других HTTP methods, таких как _9 _, _ 10_ и DELETE, вы в обязательном порядке ДОЛЖНЫ отправить некоторые данные. В качестве решения вашей проблемы вы, возможно, могли бы сделать следующее: проверить, является ли контент, который вы получили, NULL или {}, и вообще не обрабатывать его.

Если у вас все еще есть путаница в ответе, в зависимости от того, используете ли вы SOAP или REST, эта ветка должна вам помочь. Как выражать «нулевое» значение из веб-службы как настоящую нулевую или пустую строку вместо «нулевой» строки Надеюсь, это поможет.

person TheLuminor    schedule 24.09.2015
comment
Меня это не устроило бы, потому что это означает, что пользовательский интерфейс будет сдаваться {} каждый раз. По сути, мне это кажется хакерским. Я нашел решение, которое как бы опровергает то, что вы предложили, но, возможно, я неправильно понимаю ваш ответ. Я собираюсь опубликовать его, так что, с уважением, вы можете оставлять комментарии. - person MegaMatt; 25.09.2015
comment
Конечно! Поскольку вы говорите, что нашли сообщение, возможно, мое решение тоже неверно. Разместите, посмотрю :) - person TheLuminor; 25.09.2015
comment
Размещено. Дайте мне знать, что вы думаете. - person MegaMatt; 25.09.2015

Я смог выполнить то, что хотел, написав второй метод, аннотированный тем же путем REST. У этого второго метода нет оператора @Consumes и второго параметра в объявлении метода. Выглядит так:

@POST
@Path("id/{id}/doSomething")
@Produces({ MediaType.APPLICATION_JSON })
public Response doSomethingWithoutJustification(@PathParam("id") final String id) {
    doSomething(id, null);
}

Этот новый метод сопоставляется с тем же путем, но не ожидает JSON и не предоставляет второй параметр. Поэтому, когда я отправляю POST, не имея вообще ничего в теле запроса, он попадает в doSomethingWithoutJustification, а когда я действительно предоставляю JSON в теле запроса, он попадает в doSomething. Конечно, если я предоставлю что-либо, кроме действительного JSON в теле запроса, я получу от службы ответ 500, как и ожидал.

Я надеялся указать необязательный параметр с помощью одного метода, но это решение работает отлично.

person MegaMatt    schedule 25.09.2015