javax. xml .bind.JAXBElement не может быть приведен к com. oracle .xmlns.communications.ordermanagement.CreateOrderRequestType - PullRequest
0 голосов
/ 21 февраля 2020

Вот операция, над которой я работаю. Я сгенерировал WSDL, и я получил CreateOrderRequestType. java

Но когда я выполняю демонстрацию, он ищет CreateOrder. Как я могу получить класс CreateOrder.


   @WebMethod(operationName = "CreateOrder", action = "http://xmlns.oracle.com/communications/ordermanagement/CreateOrder")
    @WebResult(name = "CreateOrderResponse", targetNamespace = "http://xmlns.oracle.com/communications/ordermanagement", partName = "CreateOrderResponse")
    public CreateOrderResponseType createOrder(
        @WebParam(name = "CreateOrder", targetNamespace = "http://xmlns.oracle.com/communications/ordermanagement", partName = "CreateOrderRequest")
        CreateOrderRequestType createOrderRequest)
        throws CreateOrderFaultMsg, CreateOrderFaultMsg1, CreateOrderFaultMsg3
    ;

public static CreateOrderRequestType convertXmlStringToJavaObject(String xmlString) {
        JAXBContext jaxbContext;
        try {
            jaxbContext = JAXBContext.newInstance(CreateOrderRequestType.class);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

            StringReader reader = new StringReader(xmlString);
            CreateOrderRequestType msg = (CreateOrderRequestType) unmarshaller.unmarshal(reader);
            return msg;
        } catch (JAXBException e) {
            throw new OSMException("Unable to Convert XML String to Java Objects " + e.getMessage(), e);
        }

    }

public CreateOrderResponseType createAncillariesBySoloOrderId(String soloOrderId) {
        String message = findOrderBySoloOrderId(soloOrderId);   
        //CreateOrderRequestType createOrderRequestType = null;     
        message = "<CreateOrder xmlns=\"http://xmlns.oracle.com/communications/ordermanagement\">"
                + message 
                + "</CreateOrder>"; 
        log.info("message before converting to Java Object = " + message);
        CreateOrderRequestType  createOrderRequestType = com.spectrum.order.util.OrderUtil.convertXmlStringToJavaObject(message);
        log.info("Msg Object = " + createOrderRequestType.toString());

        return osmClient.createOrder(createOrderRequestType);   
    }

My xmlString
<CreateOrder xmlns="http://xmlns.oracle.com/communications/ordermanagement">
<msg xmlns=""><head><Client>Charter</Client><Routing>8260|1700|0090</Routing></head></msg>
</CreateOrder>


1 Ответ

1 голос
/ 22 февраля 2020

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

        Object obj = unmarshaller.unmarshal(reader);

        CreateOrderRequestType msg = null;

        if (obj instanceof CreateOrderRequestType) {
            msg = (CreateOrderRequestType) obj;
        }

        if (obj instanceof JAXBElement) {
            msg = ((JAXBElement<CreateOrderRequestType>) obj).getValue();
        }

        if (msg == null) {
            throw new OSMException("Unable to Convert XML String to Java Objects ");
        }

И, кстати, было бы лучше сделать переменную JAXBContext jaxbContext; переменной класса и инициировать ее не во время вызова службы, а в конструкторе или в некотором методе инициализации, потому что инициализация JAXBContext является трудоемкой операцией и обычно должна происходить один раз. JAXBContext является потокобезопасным, и превращение его в переменную класса не должно влиять на функциональность службы.

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