Класс XML в Java с использованием JAXBContext - PullRequest
0 голосов
/ 11 января 2019

Я создал несколько веб-служб REST, которые будут возвращать список записей из моей базы данных.

Я возвращаю все результаты запроса в формате XML и в своих методах веб-службы преобразую его в Java, чтобы отправить его в мое клиентское приложение в формате JSON (я знаю, что это не лучший случай).

Я пытаюсь сократить код в моих методах. Часть кода, с которой я начал, - это преобразование XML в Java.

Сейчас я использую следующее

String xml = xml.replaceFirst("ROWSET xmlns:xsi = " + "\"http://www.w3.org/2001/XMLSchema-instance\"", "invTrxXmlList");  
String string = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";  
xml = string.concat(xml);  
xml = xml.replaceAll("ROWSET", "invTrxXmlList");  
xml = xml.replaceAll("ROW", "invTrxXmlList");  
xml = xml.replaceAll(" xsi:nil = \"true\"", "");  
InputStream instr = new ByteArrayInputStream(xml.getBytes());  
JAXBContext jaxbContext = JAXBContext.newInstance(InvTrxXmlList.class);  
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();  
InvTrxXmlList invTrxXml = (InvTrxXmlList) jaxbUnmarshaller.unmarshal(instr);  

inventoryTrx = new InventoryTrx(invTrxXml);  

Я хочу создать отдельный метод, который может вызываться всеми методами для этого задания, если возможно, для работы с несколькими различными пользовательскими объектами, такими как InvTrxXmlList.

У меня было другое задание, немного работавшее с Reflection, и я собирался использовать его для решения этой проблемы.

Вы можете мне помочь?

Есть ли другой подход?

Спасибо

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Спасибо, Сильфреде,

Я смог заставить его работать со следующим кодом

public Object xmlToJava(Object pCurrentObject, String pXml, String pRowset, String pRow) {
    InputStream  instr = null;
    JAXBContext  jaxbContext = null;
    Unmarshaller jaxbUnmarshaller = null;

    String xmlHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
    String xmlReturn = null;
    Class  objectClass = pCurrentObject.getClass();
    try {
        xmlReturn =
            pXml.replaceFirst("ROWSET xmlns:xsi = " +
                              "\"http://www.w3.org/2001/XMLSchema-instance\"",
                              pRowset); //"invTrxLines");

        xmlReturn = xmlHeader.concat(xmlReturn);
        xmlReturn = xmlReturn.replaceAll("ROWSET", pRowset); //"invTrxLines");

        if (null != pRow && !pRow.isEmpty()) {
            xmlReturn = xmlReturn.replaceAll("ROW", pRow); //invTrxLine);
        } else { //Remove Row tags in case of single object
            xmlReturn = xmlReturn.replaceAll("<ROW>", "");
            xmlReturn = xmlReturn.replaceAll("</ROW>", "");
        }

        xmlReturn = xmlReturn.replaceAll(" xsi:nil = \"true\"", "");
        instr = new ByteArrayInputStream(xmlReturn.getBytes());
        jaxbContext = JAXBContext.newInstance(objectClass); //InvTrxHead.class);
        jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        pCurrentObject = jaxbUnmarshaller.unmarshal(instr);
    } catch (Exception e) {
        // TODO: Add catch code
        e.printStackTrace();
    }
    return pCurrentObject;
}

со следующим звонком

invTrxHead = (InvTrxHead) WSUtils.xmlToJava(invTrxHead, invTrxHeadXml, "invTrxHead", null);

Теперь я могу отправить свой XML из моей БД и экземпляра моего объекта, и мне не нужно дублировать какой-либо код.

0 голосов
/ 11 января 2019

Создать класс Java 1. @ Path ("/ URL") 2. имя класса 3. @GET или @POST 4. @Path ("/ URL") 5. @Produces ("application / xml") JAXBElement getProduct () ТОГДА ВЫ МОЖЕТЕ ИСПОЛЬЗОВАТЬ ВЫ ДОЛЖНЫ ПОЛУЧИТЬ ИЛИ УСТАНОВИТЬ ДАННЫЕ

В следующем коде показано, как использовать сгенерированные классы для возврата элемента JAXB в виде XML в методе ресурса JAX-RS:

@Path("/product")
public class ProductService {
   @GET
   @Path("/get")
   @Produces("application/xml")
   public JAXBElement<Product> getProduct() {
    Product prod = new Product();
    prod.setId(1);
    prod.setName("Mattress");
    prod.setDescription("Queen size mattress");
    prod.setPrice(500);
    return new ObjectFactory().createProduct(prod);
   }
  }

Для методов ресурсов @POST и @PUT вы можете использовать объект Product непосредственно в качестве параметра. JAX-RS отображает данные XML из запроса в объект Product.

@Path("/product")
public class ProductService {
@GET
// ...

@POST
@Path("/create")
@Consumes("application/xml")
public Response createProduct(Product prod) {
    // Process or store the product and return a response
    // ...
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...