Подтвердить что ты не робот

Как использовать JAXBElement <String> в веб-службе?

Я разрабатываю совместимый веб-сервис, используя WCF, который я потребляю от клиента Java. Когда я создал прокси-класс, он генерировал все методы getter и setter, а также поле JAXBElement<String>. Я искал это в JDK API и нашел конструктор:

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

Как использовать этот конструктор? Пожалуйста, объясните параметры и сообщите мне, есть ли хороший учебник в Интернете, описывающий его использование.

4b9b3361

Ответ 1

Решение этой проблемы, вам не нужно создавать отдельный конструктор для создания JAXBElement. Уважаемый элемент можно получить из метода objectFactory.create........(). Предположим, вы хотите создать и установить какое-то значение в объекте ответа, а аргумент имеет тип JAXBElement, тогда вам нужно сделать так:

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

Примечание. Пожалуйста, проверьте ссылку ObjectFactory, потому что в сгенерированном коде может быть несколько классов ObjectFactory, поэтому вам нужно указать точный, который связан с классом этого пакета.

Ответ 2

На всякий случай кто-то заканчивает здесь поиск решения: вместо использования JAXBElement можно использовать только Type, установив generateElementProperty в false в файле привязок.

В моем случае я использую 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> 

Ответ 3

Я просто делаю то же самое, используя Java-клиент для comsume веб-службы WCF. Я использую плагин 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>

У вас должен быть класс ObjectFactory в com.package1, который вы можете использовать для создания JAXBElements для вас, например:

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

Как примечание, вам нужно сгладить wcf wsdl до того, как jaxws смогут его использовать.

Ответ 4

Я наткнулся на этот вопрос, пока искал тот же ответ. Я отправил ответ, но нашел несколько проблем. Вот как это сделать:

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

Последнее означает параметр типа JAXBElement.

Надеюсь, что это сработает.

Ответ 5

Первый параметр name - это квалифицированное имя (локальное имя и пространство имен) элемента XML, который вы зеркалируете.

объявленный тип - это объект класса класса, к которому вы привязываете свой XML-элемент.

область - это область использования XML-элемента, но вы можете установить ее в null.

Значение - это экземпляр класса declartType, то есть фактический объект Java, привязанный к фактическому экземпляру XML-элемента.

Ответ 6

Итак, где используется.. и пример. Я хочу это..

Я нашел его. Так ты, возможно, так и сделаешь. Он будет работать.

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

Ответ 7

Попробуйте использовать minOccurs = "1" вместо minOccurs = "0" в вашем wsdl. По какой-то (хорошей) причине генератор кода нуждается в этой информации для преобразования параметров в базовые параметры типа java.

Ответ 8

У меня возникли проблемы с использованием вышеуказанных методов с использованием 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);