如何在Web服务中使用JAXBElement <string>?</string>

时间:2009-09-08 13:07:07

标签: java xml wcf web-services

我正在使用WCF开发一个可互操作的Web服务,我正在从Java客户端使用它。当我创建代理类时,它生成了所有getter和setter方法以及JAXBElement<String>字段。我在JDK API中搜索了这个并找到了构造函数:

JAXBElement(QName name, Class<T> declaredType, Class scope, T value) 

我应该如何使用此构造函数?请解释参数,如果互联网上有一个描述其用途的好教程,请告诉我。

8 个答案:

答案 0 :(得分:26)

解决这个问题的方法是,您不需要创建单独的构造函数来创建JAXBElement。可以从objectFactory.create........()方法检索受尊重的元素。假设您要在响应对象中创建和设置一些值,并且参数是JAXBElement类型的,那么您需要这样做:

someResponseObj.setMyValue(objectFactory.create.......()); 
/*method name that will be return a JAXBElement in setter()*/

注意:请检查ObjectFactory引用,因为生成的代码中可能有多个ObjectFactory类,因此您需要引用与该类相关的确切类那个包裹。

答案 1 :(得分:13)

以防万一有人在这里寻找解决方案:通过在绑定文件中将generateElementProperty设置为false,可以仅使用Type,而不是使用JAXBElement。

在我的情况下,我使用maven从wsdl生成存根文件。

部分pom文件和绑定文件(在此配置中称为javabindings.xml)

    <plugin>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-codegen-plugin</artifactId>
        <version>2.2.9</version>
        <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration>
            <sourceRoot>${project.build.directory}/wsdl2java/generated-sources/src/main/java</sourceRoot>
            <wsdlOptions>
                <wsdlOption>
                    <wsdl>${basedir}/src/main/resources/yourWsdlFileOrURL.wsdl</wsdl>

                    <extraargs>
                        <extraarg>-verbose</extraarg>
                        <extraarg>-b</extraarg>
                        <extraarg>${basedir}/src/main/resources/javabindings.xml</extraarg>
                    </extraargs>                        
                </wsdlOption>
            </wsdlOptions>

            </configuration>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
        </execution>
        </executions>
    </plugin>
<jaxb:bindings version="2.0" 
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<jaxb:bindings schemaLocation="http://localhost:15002/MiddlewareDataServiceConversion?xsd=xsd0"> 
    <jaxb:bindings node="/xs:schema"> 
        <jaxb:globalBindings generateElementProperty="false"/> 
    </jaxb:bindings> 
</jaxb:bindings> 

答案 2 :(得分:12)

我只是在做同样的事情,使用Java客户端来共享WCF Web服务。我正在使用jaxws maven插件生成客户端代码。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <configuration>
        <packageName>com.package1</packageName>
        <sourceDestDir>src/main/java</sourceDestDir>
        <wsdlDirectory>src/main/resources</wsdlDirectory>
        <wsdlFiles>
            <wsdlFile>wcf_webservice.wsdl</wsdlFile>
        </wsdlFiles>
    </configuration>
</plugin>

您应该在com.package1中拥有一个ObjectFactory类,您可以使用它来为您创建JAXBElements,例如:

ObjectFactory factory = new ObjectFactory();
MyObject myObject = new MyObject();
JAXBElement<MyObject> elem = factory.createMyObject(myObject);

正如旁注,你需要在jaxws使用它之前展平wcf wsdl。

答案 3 :(得分:5)

在我寻找同样的答案时,我偶然发现了这个问题。我发布了一个答案,但发现了一些问题。这是一种方法:

new javax.xml.bind.JAXBElement(
        new javax.xml.namespace.QName("http://locationOfURI", "nameOfElement"),
        javax.xml.bind.JAXBElement.class, 
        null, what your object's value is );

最后一个意味着JAXBElement的类型参数。

希望这有效。

答案 4 :(得分:1)

第一个参数 name 是您要镜像的XML元素的限定名称(本地名称+名称空间)。

declaredType 是您要将XML元素绑定到的类的类对象。

范围是XML元素的使用范围,但您可以将其设置为null。

declaredType 类的实例,即绑定到实际XML元素实例的实际Java对象。

答案 5 :(得分:0)

那么用法在哪里......和例子。我想要它..

我找到了。所以你可能会这样做.. 它会起作用。

Text t = new Text();
t.setValue("I need limo transportation");
JAXBElement<Text> text = new JAXBElement(SERVICE, Text.class, t);

答案 6 :(得分:0)

尝试在wsdl中使用minOccurs =“1”而不是minOccurs =“0”。出于某些(好的)原因,代码生成器需要此信息才能将参数转换为基本的java类型参数。

答案 7 :(得分:0)

根据文档我使用JAXBElement尝试上述方法时遇到了问题,而我发现了这一点,这对我来说非常有用。

        import javax.xml.bind.*;

        JAXBContext jc = JAXBContext.newInstance(YOURCLASS.class);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(yourInstantiatedClass,  System.out);