Не удается добавить XML-элемент в ответ

#java #rest #jaxb

#java #rest #jaxb

Вопрос:

Я создал веб-сервисы, которые принимают XML-данные, и после некоторых вычислений на сервере он добавляет несколько полей в xml и возвращает вывод клиенту. Я использую JAX-RS для веб-сервиса Restful и JAXB.

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

вот подробная информация о коде,

класс, представляющий XML (с использованием JAXB)

 @XmlRootElement(name = "market")
@XmlAccessorType(XmlAccessType.FIELD)
public class IBMarketInfo {

    @XmlElement(name="contract")
    Contract m_Contract;

    @XmlElement(name="tickerId")
    int m_tickerId;

    @XmlElement(name="tickList")
    String m_genericTickList;

    @XmlElement(name="snapshot")
    boolean m_snapshot;


    @XmlElement(name="mktdata") // I AM NOT BE ABLE TO VIEW THIS ELEMENT IN THE RESPONSE
    List<String>m_Ticker;




    public IBMarketInfo(){

    }
 public void setTicker(String data){
         if (m_Ticker == null) {
                m_Ticker = new ArrayList<String>();
            }
      m_Ticker.add(data);

    }
    public List<String> getTicker(){

        if (m_Ticker == null) {
                m_Ticker = new ArrayList<String>();
            }

        return m_Ticker;
    }
    public void setTickerId(int tickerid){
        m_tickerId = tickerid;
    }
    public void setGenericTickList(String ticklist){
        m_genericTickList = ticklist;
    }
    public void setSnapshot(boolean snapshot){
        m_snapshot=snapshot;
    }
    public void setContract(Contract contract){
        m_Contract = contract;
    }
    public int getTickerId(){
            return m_tickerId;
    }
    public String getGenericTickList()    {
        return m_genericTickList;
    }
    public boolean getSnapShot(){
        return m_snapshot;
    }
    public Contract getContract(){
        return m_Contract;
    }


}
  

Функция запроса веб-сервисов Restful

 public JAXBElement<IBMarketInfo>getMarketData(JAXBElement<IBMarketInfo> info){

    MainAccess ma = new MainAccess(); // MainAccess Will pull the data from external server
    IBMarketInfo market = info.getValue(); 

   ma.onRequestData(market.getTickerId(),market.getContract(),market.getGenericTickList(),
   market.getSnapShot()); // set the user given input from xml 

  return info;
}
  

Внутри класса MainAccess я делаю следующее

  public class MainAccess {

   private IBMarketInfo m_marketInfo  = new IBMarketInfo(); //declaring in class

    // as an when data comes these following functions will add data into List
    public void tickSize( int tickerId, int field, int size) {

        String msg = EWrapperMsgGenerator.tickSize( tickerId, field, size);
        m_marketInfo.setTicker(msg); // setting m_Ticker 

    }
    public void tickPrice( int tickerId, int field, double price, int canAutoExecute) {

        String msg = EWrapperMsgGenerator.tickPrice( tickerId, field, price, canAutoExecute);

        m_marketInfo.setTicker(msg); //setting m_Ticker 

    }
}
  

я создал следующий объект Market information и попытался установить значения List между кодом

 private IBMarketInfo m_marketInfo  = new IBMarketInfo();
 m_marketInfo.setTicker(msg);
  

XML-запрос

Проблема в том, что я получаю тот же XML без добавления этого mktdata

 <?xml version="1.0" encoding="UTF-8"?>
<market>
    <contract>
        <symbol>IBM</symbol>
        <sectype>STK</sectype>
        <exchange>SMART</exchange>
        <currency>USD</currency>    
    </contract> 
        <tickerId>1</tickerId>
    <tickList>1212,12121</tickList>
    <snapshot>false</snapshot>
<ticker-data></ticker-data>
</market>
  

Комментарии:

1. Вы уверены, что переменная m_Ticker заполнена? Также вы пробовали запускать автономный пример вне JAX-RS для тестирования сопоставлений?

2. я уверен, что m_Ticker с помощью m_marketInfo.setTicker(msg); строка кода, которая в конечном итоге использует m_Ticker. m извините, но я не получил ваш второй вопрос

3. В моем ответе ниже я попробовал вашу модель в отдельном примере, и все работает так, как ожидалось.

Ответ №1:

Ваша проблема в следующем коде. MainAccess создает IBMaretInfo, но вы возвращаете IBMarkettInfo, который был передан в неизмененном виде.

 public JAXBElement<IBMarketInfo>getMarketData(JAXBElement<IBMarketInfo> info){

    MainAccess ma = new MainAccess(); // MainAccess Will pull the data from external server
    IBMarketInfo market = info.getValue(); 

   ma.onRequestData(market.getTickerId(),market.getContract(),market.getGenericTickList(),
   market.getSnapShot()); // set the user given input from xml 

  return info;
}
  

Ваша модель, похоже, правильно отображает, поскольку при запуске следующего кода:

 import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

    public static void main(String[] args) throws Exception  {
        JAXBContext jc = JAXBContext.newInstance(IBMarketInfo.class);

        IBMarketInfo ibmi = new IBMarketInfo();
        ibmi.setTicker("FOO");
        ibmi.setTicker("BAR");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(ibmi, System.out);
    }

}
  

Я получаю следующий вывод:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<market>
    <tickerId>0</tickerId>
    <snapshot>false</snapshot>
    <mktdata>FOO</mktdata>
    <mktdata>BAR</mktdata>
</market>
  

Комментарии:

1. Как бы я это изменил, я имею в виду, как я могу отразить изменение в информации?

2. @Hunt — Это зависит от того, хотите ли вы, чтобы MainAccess создал новый IBMarketInfo? Если это так, вы возвращаете JAXBElement, обертывающий IBMarketInfo из MainAcess. Если вы хотите, чтобы MainAccess действовал на основе переданного IBMarketInfo, вы могли бы сделать MainAccess без состояния и передать IBMarketInfo в качестве параметра.

3. я получил первый способ, но во втором вы хотите сказать, что входные данные, которые я получаю в качестве параметра в функции запроса веб-сервиса, я передаю эту информацию IBMarketInfo в MainAccess в качестве аргумента и изменяю ее?