2016-05-27 5 views
0

Я использую Джерси dropwizard и пытается обновить запись следующим образом:доступ JSON данные в запросе PUT - Джерси Dropwizard

@PUT 
    @Path("api/v1/tasks/{taskId}") 
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
    @Produces(MediaType.APPLICATION_JSON) 
    @UnitOfWork 
    public Task updateMyTask(@PathParam("taskId") long taskId, @QueryParam("description") String description) { 
     ... 

     System.out.println(description); // Always `null` 

     ... 
    } 

Мои данные запроса:

{ "description": "dummy description" } 

Моя проблема заключается в том, что я не удалось получить доступ к данным, поступающим в запрос PUT. Он всегда отображается как null. Я уже пробовал это с @FormParam, не повезло.

EDIT:

После Sam's ответа, я сделал предложенные изменения и получать следующие исключения:

@PUT 
@Path("api/v1/tasks/{taskId}") 
@Consumes(MediaType.APPLICATION_JSON) 
@UnitOfWork 
public Task updateTask(Task task, @PathParam("taskId") long taskId) { 
    ... 

    System.out.println(task.getDescription()); 

    ... 
} 

Возвратившись ошибка:

{ 
    "code": 400 
    "message": "Unable to process JSON" 
} 
+0

Получаете ли вы какой-либо другой результат для сообщения об ошибке? Есть ли файл журнала в любом месте? Было бы хорошо знать, почему десериализация JSON терпит неудачу. – Sam

+0

Не так много в журнале: '127.0.0.1 - - [27/Май/2016: 19: 26: 10 +0000]" PUT/api/v1/tasks/1 HTTP/1.1 "400 47" - "" - "92 '. Не знаете, как я могу видеть подробные журналы в приложении dropwizard. – RAJ

+0

Имеет ли класс POJO конструктор no-args? – Sam

ответ

0

Данные не @FormParam или @QueryParam, это всего лишь тело запроса, поэтому ему не нужна никакая аннота ЦИИ.

Что ему нужно, это POJO, который описывает формат данных JSON, которые вы предоставляете. Для простого String значение, которое может выглядеть следующим образом:

class Task { 
    String description; 
    ... // other fields 
} 

Ваш @Consumes аннотацию путается, тоже. Вы аннотировали метод как @Consumes(MediaType.APPLICATION_FORM_URLENCODED), но вы пытаетесь отправить его данные JSON. Заявите свой метод как:

@Consumes(MediaType.APPLICATION_JSON) 
... 
public Task updateMyTask(Task task, @PathParam("taskId") long taskId) { 
    System.out.println(task.description); // not null any more 
} 

Вам необходимо убедиться, что в Джерси включено отображение JSON.

+0

Я просто экспериментировал с '@ Consumes'. Однако, попробовав с помощью' APPLICATION_JSON', спасибо за то, что привлек мой разум. У меня есть больше атрибутов, которые я бы передал Я не уверен в создании отдельного класса для каждого атрибута модели «Задача». Проверьте EDIT в моем вопросе – RAJ

+0

@ RAJ, вы бы определили все атрибуты JSON в том же классе. Я отредактирую свой ответ. – Sam

+0

Я уже определил требуемые все сеттеры и геттеры – RAJ

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

  • Нет связанных вопросов^_^