2015-03-12 4 views
0

, поэтому я довольно новичок в Spring MVC и строю приложение, в котором размещаются + использует несколько API, большая часть из них работает нормально, но теперь я столкнулся с стеной.Сопоставление объекта с Spring MVC REST

По какой-то причине атрибуты из xml не отображаются в объекте. У меня не было этой проблемы с JSON, но, к сожалению, в этом случае я нахожусь на получающей стороне, и я не могу изменить формат запроса. Запрос полезного что-то вроде:

<xml> 
<ToUserName> <![CDATA[toUser]]> </ToUserName> 
<FromUserName> <![CDATA[fromUser]]> </FromUserName> 
<CreateTime> 1348831860 </CreateTime> 
<MsgType> <![CDATA[text]]> </MsgType> 
<Content><![CDATA[this is a test]]></Content> 
<MsgId>123456789</MsgId> 
</xml> 

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

@RequestMapping(value = "/msg", method = RequestMethod.POST, consumes = "application/xml", produces = "application/xml") 
    @ResponseBody 
    public void receive(@RequestBody ReceivedMessage msg) { 
     //TODO: do something with the message here... for now just dump into log 
     System.out.println(msg); 
    } 

Похоже, он должен работать, не так ли? Ну, выход идет как

ReceivedMessage{toUserName=null, fromUserName=null, createTime=null, msgType=null, msgId=null, medes=null, content=null, picUrl=null, format=null, thumbMediaId=null, location_X=null, location_Y=null, label=null, scale=null, title=null, description=null, url=null, recognition=null, event=null, eventKey=null, ticket=null, latitude=null, longitude=null, precision=null} 

Как вы можете видеть, все атрибуты равны нулю, даже те, которые указаны в полезной нагрузке ...

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

Любая помощь с благодарностью, спасибо.

EDIT: Исправлена ​​опечатка в названии ... EDIT2: дальнейшая информация ... соответствующая часть сервлетов конфигурации:

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> 
    <bean id="xmlConverter" class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter"/> 
    <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/> 

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
     <property name="messageConverters"> 
      <list> 
       <ref bean="jsonConverter" /> 
       <ref bean="xmlConverter" /> 
      </list> 
     </property> 
    </bean> 

EDIT3: ReceivedMessage (добытчиками и сеттеров опущены):

public class ReceivedMessage{ 
    //common 
    private String toUserName; 
    private String fromUserName; 
    private Long createTime; 
    private String msgType; 

    private Long msgId; 

    private String medes; 

    //text 
    private String content; 
    //image 
    private String picUrl; 
    //voice + speech recognition 
    private String format; 
    //video 
    private String thumbMediaId; 
    //location 
    private Double location_X; 
    private Double location_Y; 
    private String label; 
    private Double scale; 
    //link 
    private String title; 
    private String description; 
    private String url; 
    //speech recognition 
    private String recognition; 
    //event + QR code scan + location incident + menu event 
    private String event; 
    //QR code scan + menu event 
    private String eventKey; 
    //QR code scan 
    private String ticket; 
    //location incident 
    private Double latitude; 
    private Double longitude; 
    private Double precision; 

    public ReceivedMessage() { 
    } 
} 
+0

Так как вы хотите, чтобы преобразовать XML в объект Java и наоборот, вам нужно использовать JAXB для сортировочных и немаршалинг , Весной это могут быть готовые преобразователи сообщений, такие как Jaxb2RootElementHttpMessageConverter. – Mithun

+0

Просьба поделиться содержимым класса «ReceivedMessage». – Mithun

+0

Класс @Mithun добавлен, в настоящее время рассматривается Jaxb2RootElementHttpMessageConverter – OsaSoft

ответ

2

Jaxb2RootElementHttpMessageConverter используется для преобразования объектов Java в/из XML. Преобразование сообщений работает, если оно удовлетворяет условиям ниже:

  • Этот преобразователь предварительно включен, если JAXB2 присутствует в пути к классам.
  • Класс Java должен иметь XML для ява связывания деталей

Пример:

@XmlRootElement 
public class Customer { 
    String name; 
    int id; 

    public String getName() { 
     return name; 
    } 

    @XmlElement 
    public void setName(String name) { 
     this.name = name; 
    } 

    public int getId() { 
     return id; 
    } 

    @XmlAttribute 
    public void setId(int id) { 
     this.id = id; 
    } 
} 
+0

выбрасывает исключение для неизвестного элемента перед добавлением (name = "xml") в аннотацию XmlRootElement, теперь он идет нормально, но с тем же результатом, что и в начале, все значения – OsaSoft

+0

Не уверен если это проблема. Не могли бы вы переименовать теги так же, как имена переменных в классе java. Например: ToUserName ** - ** toUserName. – Mithun

+0

ну, так как я не могу изменить вход xml (его от стороннего API), я решил удалить геттеры/сеттеры, сделать вары общедоступными и переименовать их, чтобы начать с заглавной буквы. Это работает. Это не идеальный вариант, поскольку он разрывает инкапсуляцию и соглашения об именах, но, учитывая ситуацию, это кажется необходимым. Спасибо за помощь – OsaSoft

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