繁体   English   中英

JAXB 多个 @XmlRootElement

[英]JAXB multiple @XmlRootElement

我有一个类注释如下:

@XmlRootElement(name="response")
@XmlType(propOrder={"paymentid", 
                    "result",
                    "responsecode", 
                    "authorizationcode", 
                    "merchantorderid", 
                    "rrn", 
                    "cardcountry", 
                    "cardtype"})
public class MOTOResponseIn {
...
}

除了response 之外,映射的 XML 的根元素也可能是error

如何注释类以便允许两个根元素?

在这种情况下,不能使用@XmlRootElement。 你必须使用ObjectFactory。 @XmlElementDecl批注用于表示与命名复杂类型对应的根元素。 它放在使用@XmlRegistry注释的类中的工厂方法中(当从XML模式生成时,此类始终称为ObjectFactory)。 工厂方法返回包装在JAXBElement实例中的域对象。希望这个url会有所帮助。

https://dzone.com/articles/jaxb-and-root-elements

使用单个类和 @XmlRootElement 是不可能的。 但是,如果您不想弄乱 ObjectFactory,为了快速解决,您可以使用抽象类和具体类。 (假设唯一的区别是根元素)

例子:

@XmlAccessorType(XmlAccessType.FIELD)
public abstract class MOTOabstract{
     @XmlAttribute
     private String paymentid;

     @XmlAttribute
     private String result

     @XmlAttribute
     private String responsecode;

     ...
}

@XmlRootElement(name="response")
@XmlAccessorType(XmlAccessType.FIELD)
public class MOTOresponse extends MOTOabstract{}

@XmlRootElement(name="error")
@XmlAccessorType(XmlAccessType.FIELD)
public class MOTOerror extends MOTOabstract{}

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "id",
        "name",
        "serviceAttrs"
    })
    @XmlSeeAlso({ AddGroup.class, AddGroupRequest.class })
    public class AddGroupAbstract {
    
        @XmlElement(required = true)
        protected String id;
        @XmlElement(required = true)
        protected String name;
        @XmlElement(required = true)
        protected ServiceAttrs serviceAttrs;
    
        ...
    }
    
    @XmlRootElement(name = "addGroup")
    public class AddGroup extends AddGroupAbstract {}
    
    @XmlRootElement(name = "addGroupRequest")
    public class AddGroupRequest extends AddGroupAbstract {}
    
@Endpoint
public class GroupEndpoint {
    private final GroupService groupService;
    private final ServiceService serviceService;
    private final RestTemplate restTemplate;

    public GroupEndpoint(GroupService groupService, ServiceService serviceService, RestTemplate restTemplate) {
        this.groupService = groupService;
        this.serviceService = serviceService;
        this.restTemplate = restTemplate;
    }

    @PayloadRoots({
        @PayloadRoot(namespace = SoapConstants.NAMESPACE_ACCOUNT_URI, localPart = "addGroup"),
        @PayloadRoot(namespace = SoapConstants.NAMESPACE_ACCOUNT_URI, localPart = "addGroupRequest")
    })
    @ResponsePayload
    public AddGroupResponse addGroup(@RequestPayload AddGroupAbstract request) {
        AddGroupResponse response = new AddGroupResponse();

        ...
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM