2015-04-03 2 views
1

Я пытаюсь реализовать фреймворк Джерси, чтобы маршрутизировать наши клиентские запросы, используя спокойный подход. Я успешно создал методы, которые читают примитивные параметры, отправляют их, и они могут даже отвечать JSON с объекта. Однако одна вещь, которую я не смог сделать, - это прочитать (т. Е. Уничтожить) объект json из сообщения post/put или даже получить запрос. Я пробовал все, что я могу найти в Интернете, но безрезультатно. Из-за некоторых проблем работы я ограничен использованием Java 6 и Jersey 1.19. Также для нашей клиентской стороны мы используем ExtJS.Остальные веб-сервисы, использующие JSON с использованием Jersey и ExtJS

Мой запрос ExtJS отформатирован так:

Ext.Ajax.request({ 
url: 'rest/RestClass/getMessage', 
method: 'PUT', 
header: { 
    'Content-Type': 'application/json' 
}, 
jsonData: { 
    status: { 
     id: 1, 
     description: 'Description' 
    } 
}, 
success: function(response) { 
    var result = response.responseText; 
}, 
failure: function(response) { 
    Ext.Msg.alert('Communication Error', 'Failed'); 
} 
}); 

Насколько мой задний конец материал проходит у меня есть это:

@PUT 
@Path("/getMessage") 
@Consumes(MediaType.APPLICATION_JSON) 
public void getMsg(JAXBElement<Status> status) { 
    System.out.println("status id = " + status.getValue().getId()); 
    System.out.println("status description = " + status.getValue().getDescription()); 
} 

Кроме того, мой статусный объект:

@XmlRootElement 
public class Status{ 

    private int id; 
    private String description; 

    public Status() { 

    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public String getDescription() { 
     return description; 
    } 
} 

Я правильно отобразил сервлет и т. Д., Так как я уже отправил успешные запросы. Моя проблема в том, что когда я пытаюсь отправить один с json-объектом в параметры, я получаю ошибки.

Поначалу я получал ошибку в недостающей библиотеке jackson, хотя я использую jersey-bundle-1.19.jar, который якобы содержит все необходимое. После загрузки jackson-jaxrs-1.9.13.jar и добавить его в проект Сейчас я получаю эту ошибку:

A message body reader for Java class javax.xml.bind.JAXBElement, and Java type javax.xml.bind.JAXBElement, and MIME media type application/json was not found.

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

Что я ищу здесь, это решение с теми вещами, которые у меня есть: Джерси 1.19 ExtJS 5 JDK 6 WebLogic 10.X

цель состоит в том, чтобы иметь возможность послать запрос с JSONObject в качестве параметра и его декодирования на стороне сервера в существующий тип объекта.

EDIT: Я даже добавил отображение POJO в моей web.xml (я нашел в Интернете, что необходимо для трикотажа для поддержки JSon отображения/объекта)

<init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 

Еще есть та же самая проблема. Клиент дает мне 415 error for unsupported media type

+0

Почему вы отправляете тип JAXBElement ? Это должно быть только состояние. Например: public void getMsg (статус состояния). Вам также не требуется аннотация: @XmlRootElement – facundofarias

+0

Так как все примеры, которые я видел, имели эти аннотации. Я наконец нашел ответ и да, он не нуждается в этих аннотациях. Однако для конструктора моей модели нужна аннотация @JsonCreator. – Konstantine

+1

Поскольку я привел вас к разрешению, и меньше всего вы можете поставить upvote! Не думаешь? :) – facundofarias

ответ

0

Я нашел решение своей проблемы. Есть несколько изменений, которые необходимо внести:

В объекте jsonData запроса не должно быть свойства root status. Только сам объект:

jsonData: { 
    id: 1, 
    description: 'Description' 
}, 

Также я удалил JAXBElement<Status> из декларации моего метода. Он просто получает объект Status status.

И, наконец, Status class не нуждается в аннотациях @XmlRootElement. Однако он нуждается в аннотации @JsonCreator по своему конструктору по умолчанию (пустой).

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