GVKun编程网logo

web-services – 使用JAXB和JAXWS Annotations将枚举属性编组到XML中(枚举类中添加属性)

25

以上就是给各位分享web-services–使用JAXB和JAXWSAnnotations将枚举属性编组到XML中,其中也会对枚举类中添加属性进行解释,同时本文还将给你拓展JacksonJAXBAnn

以上就是给各位分享web-services – 使用JAXB和JAXWS Annotations将枚举属性编组到XML中,其中也会对枚举类中添加属性进行解释,同时本文还将给你拓展Jackson JAXB Annotations 2.6.2 发布、java – 来自Webservice编组错误的JAXB类、javax.xml.bind.annotation.XmlAccessOrder的实例源码、javax.xml.bind.annotation.XmlAccessorOrder的实例源码等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

web-services – 使用JAXB和JAXWS Annotations将枚举属性编组到XML中(枚举类中添加属性)

web-services – 使用JAXB和JAXWS Annotations将枚举属性编组到XML中(枚举类中添加属性)

假设我们有以下 Java 1.5枚举:
import javax.xml.bind.annotation.XmlAccesstype;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;

@XmlAccessorType(XmlAccesstype.FIELD)
public enum ReturnCode {
    OK(0,"Ok"),ERROR_VALIDATION(1,"Validation Error"),ERROR_TRANSPORT(2,"Transport Error"),ERROR_CASE_01(101,"Business situation #01"),ERROR_CASE_02(102,"Business situation #02"),ERROR_CASE_03(103,"Business situation #03");

    @XmlElement(nillable=false,required=true)
    private Integer code = 0;

    @XmlElement(nillable=false,required=true)
    private String message = null;

    private ReturnCode(Integer code,String message) {
        this.code = code;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

我正在使用Apache CXF和生成的WSDL,正如预期的那样,将上述枚举转换为限制:

<xsd:simpleType name="ReturnCode">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="OK"/>
        <xsd:enumeration value="ERROR_VALIDATION"/>
        <xsd:enumeration value="ERROR_TRANSPORT"/>
        <xsd:enumeration value="ERROR_CASE_01"/>
        <xsd:enumeration value="ERROR_CASE_02"/>
        <xsd:enumeration value="ERROR_CASE_03"/>
    </xsd:restriction>
</xsd:simpleType>

到目前为止这么好,这是一个理想的功能.我自己记得在Apache CXF之前与这样的结构挣扎(当我使用XFire时).

但是,这不是这种情况.我想产生不同的结果.我希望将枚举转换为复杂类型,并且在编组包含此枚举实例的对象时,将属性代码和消息都转换为XML元素.我只希望它不像enum那样表现.我知道如果我使用普通类而不是枚举,我可以实现这一目标.但是,我非常希望保持枚举,所以我在代码的java部分保持类型安全.

如果生成的WSDL仍然可能对可能的值有限制,那么它将是完美的场景.但是,我可以没有它.这里最重要的是保持Java 1.5枚举,同时仍然编组(并生成WSDL)ReturnCode作为复杂类型,代码和消息作为其元素.

我尝试用枚举源代码中的给定JAXWS Annotations提示.是否有可能通过那些(或其他一些)注释来实现这一点?或者我是否必须编写自定义marshaller / unmarshaller和WSDL生成器?

非常感谢你!

最好的祝福,

Filipe Fedalto

解决方法

在您的java服务器代码中使用枚举,并在您的服务接口中转换为复杂类型.

例:

@WebMethod
public ComplexType GetInfo(){
  ReturnCode response;
  response = ReturnCode.OK;
  ComplexType wsResponse;
  wsResponse = response.toComplexType()
  return wsResponse;
}

@WebMethod
public void PutInfo(ComplexType input){
  ReturnCode request = ReturnCode.fromComplexType(input);
  //more code
}

Jackson JAXB Annotations 2.6.2 发布

Jackson JAXB Annotations 2.6.2 发布

Jackson JAXB Annotations 2.6.2 发布,此版本更新内容如下:

#47: JaxbAnnotationIntrospector does not pick up ''required'' property of @XmlAttribute
 (reported by phantomjinx@github)

下载:https://github.com/FasterXML/jackson-module-jaxb-annotations/releases。

java – 来自Webservice编组错误的JAXB类

java – 来自Webservice编组错误的JAXB类

我有一些wsimport生成的JAXB类
wsimport -d src/main/java -keep -extension
  -p my.package
  http://www.OpenLigaDB.de/Webservices/Sportsdata.asmx?WSDL

我将演示这个类的问题(我自己只添加了@XmlRootElement):

package my.package;

import javax.xml.bind.annotation.XmlAccesstype;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccesstype.FIELD)
@XmlType(name = "Sport",propOrder = {"sportsID","sportsName"})
@XmlRootElement(name = "sport")   //Added by myself
public class Sport
{
    protected int sportsID;
    protected String sportsName;

    public int getSportsID() {return sportsID;}
    public void setSportsID(int value) {this.sportsID = value;}

    public String getSportsName() {return sportsName;}
    public void setSportsName(String value) {this.sportsName = value;}
}

直接实例化和编组工作正常(例1)

Sport sport = new Sport();
sport.setSportsID(1);
sport.setSportsName("test");

JAXBContext jc = JAXBContext.newInstance(Sport.class);
jc.createMarshaller().marshal(sport,System.out);

现在让我们在webservice调用中创建对象:

SportsdataSoap s = new Sportsdata().getSportsdataSoap();
ArrayOfSport sports = s.getAvailSports();

for(Sport sport : sports.getSport())
{
    JAXBContext jc = JAXBContext.newInstance(Sport.class);
    jc.createMarshaller().marshal(sport,System.out);
}

然后我得到了这个例外:

Exception in thread "main" java.lang.classCastException: my.package.Sport$JaxbAccessorF_sportsID cannot be cast to com.sun.xml.bind.v2.runtime.reflect.Accessor
    at com.sun.xml.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.instanciate(OptimizedAccessorFactory.java:199)
    at com.sun.xml.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.get(OptimizedAccessorFactory.java:191)
    at com.sun.xml.bind.v2.runtime.reflect.Accessor$FieldReflection.optimize(Accessor.java:282)
    at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.<init>(SingleElementNodeProperty.java:94)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.sun.xml.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:128)
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:183)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getorCreate(JAXBContextImpl.java:526)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:341)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1158)
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:140)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:363)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
    at my.package.TestOpenLiga.testdisciplines(TestOpenLiga.java:48)
    at my.package.TestOpenLiga.main(TestOpenLiga.java:130)

怎么处理这个?谢谢你,托尔.

更新2如果我修改Example1到此,我得到相同的错误

SportsdataSoap s = new Sportsdata().getSportsdataSoap();

Sport sport = new Sport();
sport.setSportsID(1);
sport.setSportsName("test");

JAXBContext jc = JAXBContext.newInstance(Sport.class);
jc.createMarshaller().marshal(sport,System.out);

更新2体育的XML结构

<Sport>
  <sportsID>int</sportsID>
  <sportsName>string</sportsName>
</Sport>

解决方法

我不确定这是否是导致这种情况发生的唯一原因,但这是我遇到的一个问题并且这样解决了,请检查您的Java认可目录并删除任何重复的jaxb-impl.jar.即使使用webservice-api.jar,也可能发生这种情况.希望这可以帮助.

javax.xml.bind.annotation.XmlAccessOrder的实例源码

javax.xml.bind.annotation.XmlAccessOrder的实例源码

项目:Openjsharp    文件:ClassInfoImpl.java   
/**
 * Gets the accessor order for this class by consulting {@link XmlAccessorOrder}.
 */
private XmlAccessOrder getAccessorOrder() {
    XmlAccessorOrder xao = getClassOrPackageAnnotation(XmlAccessorOrder.class);
    if(xao!=null)
        return xao.value();
    else
        return XmlAccessOrder.UNDEFINED;
}
项目:openjdk-jdk10    文件:ClassInfoImpl.java   
/**
 * Gets the accessor order for this class by consulting {@link XmlAccessorOrder}.
 */
private XmlAccessOrder getAccessorOrder() {
    XmlAccessorOrder xao = getClassOrPackageAnnotation(XmlAccessorOrder.class);
    if(xao!=null)
        return xao.value();
    else
        return XmlAccessOrder.UNDEFINED;
}
项目:openjdk9    文件:ClassInfoImpl.java   
/**
 * Gets the accessor order for this class by consulting {@link XmlAccessorOrder}.
 */
private XmlAccessOrder getAccessorOrder() {
    XmlAccessorOrder xao = getClassOrPackageAnnotation(XmlAccessorOrder.class);
    if(xao!=null)
        return xao.value();
    else
        return XmlAccessOrder.UNDEFINED;
}
项目:lookaside_java-1.8.0-openjdk    文件:ClassInfoImpl.java   
/**
 * Gets the accessor order for this class by consulting {@link XmlAccessorOrder}.
 */
private XmlAccessOrder getAccessorOrder() {
    XmlAccessorOrder xao = getClassOrPackageAnnotation(XmlAccessorOrder.class);
    if(xao!=null)
        return xao.value();
    else
        return XmlAccessOrder.UNDEFINED;
}
项目:infobip-open-jdk-8    文件:ClassInfoImpl.java   
/**
 * Gets the accessor order for this class by consulting {@link XmlAccessorOrder}.
 */
private XmlAccessOrder getAccessorOrder() {
    XmlAccessorOrder xao = getClassOrPackageAnnotation(XmlAccessorOrder.class);
    if(xao!=null)
        return xao.value();
    else
        return XmlAccessOrder.UNDEFINED;
}
项目:cxf-plus    文件:ClassInfoImpl.java   
/**
 * Gets the accessor order for this class by consulting {@link XmlAccessorOrder}.
 */
private XmlAccessOrder getAccessorOrder() {
    XmlAccessorOrder xao = getClassOrPackageAnnotation(XmlAccessorOrder.class);
    if(xao!=null)
        return xao.value();
    else
        return XmlAccessOrder.UNDEFINED;
}
项目:OLD-OpenJDK8    文件:ClassInfoImpl.java   
/**
 * Gets the accessor order for this class by consulting {@link XmlAccessorOrder}.
 */
private XmlAccessOrder getAccessorOrder() {
    XmlAccessorOrder xao = getClassOrPackageAnnotation(XmlAccessorOrder.class);
    if(xao!=null)
        return xao.value();
    else
        return XmlAccessOrder.UNDEFINED;
}
项目:openjdk-icedtea7    文件:ClassInfoImpl.java   
/**
 * Gets the accessor order for this class by consulting {@link XmlAccessorOrder}.
 */
private XmlAccessOrder getAccessorOrder() {
    XmlAccessorOrder xao = getClassOrPackageAnnotation(XmlAccessorOrder.class);
    if(xao!=null)
        return xao.value();
    else
        return XmlAccessOrder.UNDEFINED;
}

javax.xml.bind.annotation.XmlAccessorOrder的实例源码

javax.xml.bind.annotation.XmlAccessorOrder的实例源码

项目:Openjsharp    文件:ClassInfoImpl.java   
/**
 * Gets the accessor order for this class by consulting {@link XmlAccessorOrder}.
 */
private XmlAccessOrder getAccessorOrder() {
    XmlAccessorOrder xao = getClassOrPackageAnnotation(XmlAccessorOrder.class);
    if(xao!=null)
        return xao.value();
    else
        return XmlAccessOrder.UNDEFINED;
}
项目:openjdk-jdk10    文件:ClassInfoImpl.java   
/**
 * Gets the accessor order for this class by consulting {@link XmlAccessorOrder}.
 */
private XmlAccessOrder getAccessorOrder() {
    XmlAccessorOrder xao = getClassOrPackageAnnotation(XmlAccessorOrder.class);
    if(xao!=null)
        return xao.value();
    else
        return XmlAccessOrder.UNDEFINED;
}
项目:openjdk9    文件:ClassInfoImpl.java   
/**
 * Gets the accessor order for this class by consulting {@link XmlAccessorOrder}.
 */
private XmlAccessOrder getAccessorOrder() {
    XmlAccessorOrder xao = getClassOrPackageAnnotation(XmlAccessorOrder.class);
    if(xao!=null)
        return xao.value();
    else
        return XmlAccessOrder.UNDEFINED;
}
项目:lookaside_java-1.8.0-openjdk    文件:ClassInfoImpl.java   
/**
 * Gets the accessor order for this class by consulting {@link XmlAccessorOrder}.
 */
private XmlAccessOrder getAccessorOrder() {
    XmlAccessorOrder xao = getClassOrPackageAnnotation(XmlAccessorOrder.class);
    if(xao!=null)
        return xao.value();
    else
        return XmlAccessOrder.UNDEFINED;
}
项目:infobip-open-jdk-8    文件:ClassInfoImpl.java   
/**
 * Gets the accessor order for this class by consulting {@link XmlAccessorOrder}.
 */
private XmlAccessOrder getAccessorOrder() {
    XmlAccessorOrder xao = getClassOrPackageAnnotation(XmlAccessorOrder.class);
    if(xao!=null)
        return xao.value();
    else
        return XmlAccessOrder.UNDEFINED;
}
项目:cxf-plus    文件:ClassInfoImpl.java   
/**
 * Gets the accessor order for this class by consulting {@link XmlAccessorOrder}.
 */
private XmlAccessOrder getAccessorOrder() {
    XmlAccessorOrder xao = getClassOrPackageAnnotation(XmlAccessorOrder.class);
    if(xao!=null)
        return xao.value();
    else
        return XmlAccessOrder.UNDEFINED;
}
项目:OLD-OpenJDK8    文件:ClassInfoImpl.java   
/**
 * Gets the accessor order for this class by consulting {@link XmlAccessorOrder}.
 */
private XmlAccessOrder getAccessorOrder() {
    XmlAccessorOrder xao = getClassOrPackageAnnotation(XmlAccessorOrder.class);
    if(xao!=null)
        return xao.value();
    else
        return XmlAccessOrder.UNDEFINED;
}
项目:openjdk-icedtea7    文件:ClassInfoImpl.java   
/**
 * Gets the accessor order for this class by consulting {@link XmlAccessorOrder}.
 */
private XmlAccessOrder getAccessorOrder() {
    XmlAccessorOrder xao = getClassOrPackageAnnotation(XmlAccessorOrder.class);
    if(xao!=null)
        return xao.value();
    else
        return XmlAccessOrder.UNDEFINED;
}

我们今天的关于web-services – 使用JAXB和JAXWS Annotations将枚举属性编组到XML中枚举类中添加属性的分享就到这里,谢谢您的阅读,如果想了解更多关于Jackson JAXB Annotations 2.6.2 发布、java – 来自Webservice编组错误的JAXB类、javax.xml.bind.annotation.XmlAccessOrder的实例源码、javax.xml.bind.annotation.XmlAccessorOrder的实例源码的相关信息,可以在本站进行搜索。

本文标签: