javax.xml.bind.JAXBElement无法转换为com.oracle.xmlns.communications.ordermanagement.CreateOrderRequestType

问题描述 投票:0回答:1

这是我正在从事的手术。我生成了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>


java unmarshalling
1个回答
0
投票

看来,在解组期间将返回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是线程安全的,并且使其成为类变量应该不会影响服务功能。

© www.soinside.com 2019 - 2024. All rights reserved.