Использовать демаршаллинг JAXB в Weblogic Server - PullRequest
3 голосов
/ 23 декабря 2010

Especifications: - Сервер: Weblogic 9.2 исправлен заказчиком. - веб-сервисы, определенные в файлах wsdl и xsd, исправленных клиентом; не допускаются изменения.

Привет

В проекте нам нужно разработать почтовую систему. Это должно сделать общую работу с веб-сервисом. Мы создаем Бин, который получает автоматически сгенерированный класс из некорневого элемента xsd (не wsdl); этот боб делает эту общую работу. Почтовая система получает xml с элементами, определенными в файле xsd, и нам нужно перенести эту информацию об элементах в сгенерированные wsdlc классы. С этими объектами мы можем использовать этот общий боб. Не удается перенаправить почтовый запрос на веб-сервис.

Мы ищем код для этого с ресурсами WL9.2, но ничего не нашли. На данный момент мы попытались использовать JAXB для этого демаршаллинга:

JAXBContext c = JAXBContext.newInstance(new Class[]{WasteDCSType.class});
Unmarshaller u = c.createUnmarshaller();
WasteDCSType w = u.unmarshal(waste, WasteDCSType.class).getValue();

Переменная отходов - это объект DOM Element. Это не корневой элемент, потому что корень не включен в XSD

Сначала нам нужно было добавить конструктор без аргументов в некоторые автоматически сгенерированные классы. Нет проблем, мы решили это и, наконец, мы расшифровали XML без исключений ошибки. Но у нас были проблемы с атрибутами. Unmarshalling не установить атрибуты; ни один из них ни в каком классе, ни простые атрибуты, ни большие или короткие атрибуты перечисления. Нет проблем с элементами XML любого типа.

Мы не можем создать демаршаллер из "строки контекста" (имя пакета), потому что объектная фабрика не была создана wsldc Если мы установим схему, описания элементов не будут найдены и произойдет аварийный сбой.

Это содержимое сборки:

<taskdef name="jwsc" classname="weblogic.wsee.tools.anttasks.JwscTask" />
<taskdef name="wsdlc" classname="weblogic.wsee.tools.anttasks.WsdlcTask"/>    

 <target name="generate-from-wsdl">
        <wsdlc
            srcWsdl="${src.dir}/wsdls/e3s-environmentalMasterData.wsdl"
            destJwsDir="${src.dir}/webservices"
            destImplDir="${src.dir}/webservices"
            packageName="org.arc.eterws.generated"
            />
        <wsdlc
            srcWsdl="${src.dir}/wsdls/e3s-waste.wsdl"
            destJwsDir="${src.dir}/webservices"
            destImplDir="${src.dir}/webservices"
            packageName="org.arc.eterws.generated"
            />
    </target>

<target name="webservices" description="">
        <jwsc srcdir="${src.dir}/webservices" destdir="${dest.dir}" classpathref="wspath">
            <module contextPath="E3S" name="webservices">

                <jws file="org/arc/eterws/impl/IE3SEnvironmentalMasterDataImpl.java"
                        compiledWsdl="${src.dir}/webservices/e3s-environmentalMasterData_wsdl.jar"/>

                <jws file="org/arc/eterws/impl/Ie3SWasteImpl.java"
                        compiledWsdl="${src.dir}/webservices/e3s-waste_wsdl.jar"/>

                <descriptor file="${src.dir}/webservices/META-INF/web.xml"/>
            </module>

        </jwsc>
</target>

Мои вопросы:

  • Как Weblogic "unmarshall" XML с технологией JAX-RPC и можем ли мы сделать то же самое с элементом xsd?
  • Как мы можем это сделать, если да?
  • Если нет, существует любой не сложный решение этой проблемы?
  • Если нет, мы должны использовать технологию XMLBean. или же восстановить XSD с технологией JAXB. Какое лучшее решение?

ПРИМЕЧАНИЕ. На самом деле существует не одна единица xsd, а сложная структура xsd.

1 Ответ

1 голос
/ 02 февраля 2011

Если XSD, который определяет xml, который получает почтовый сервер, является тем же самым (или буквально, будучи тем же самым файлом (ами) или семантически имеющим те же самые полные имена) как xsd, включенный в wsdl, тогдаСгенерированные jaxb классы должны быть в состоянии быть переданными прямо.

Если нет, то большой двоичный объект xml из почтового сервиса просто НЕ может быть отправлен прямо в веб-сервис.Но это нормально, это то, для чего предназначен ваш компонент-брокер.

Вы демонтируете xml как вы делаете, затем вы вручную создаете новый объект (объект jaxb, сгенерированный wsdl) на основе не маршализованного объекта почтового сервера.

Я понимаю, что объекты (почта и веб-сервисы) могут быть логически одинаковыми, и вы надеетесь на какой-то волшебный клей, но XML намного строже этого.

Если вы пытаетесь использовать демаршаллер JAXB из классов, сгенерированных веб-службами, для демаршаллизации XML из почтовой службы, опять же, это полностью завершится ошибкой, если схемы не идентичны

Помните, и это важно, следующие два xml-фрагмента НЕ одинаковы, независимо от того, насколько вы хотите, чтобы они были.

<blob xmlns="urn:mailserver.schema.generated">
   <from>blah</from>
   <to>wop</to>
   <message>this is a message</message>
</blob>

<blob xmlns="urn:webservice.wsdl.generated">
   <from>blah</from>
   <to>wop</to>
   <message>this is a message</message>
</blob>
...