LINUX.ORG.RU

Сериализация java классов в soap запрос.


0

0

Проблема заключается в следующем:

Есть потребность сделать это в виде SOAPMessage, так как позже необходимо добавить цифровую подпись к soap-запросу. Попытался найти примеры, но нашел только примеры которые у меня не заработали. Также проблема с документацией - нет человеческого описания методов классов, также как и входных параметров к ним. Делаю это все на Axis, в eclipse.

Просьба в том чтоб объяснили молодому не опытному: написать хотя бы код примера реализующего парсинг, либо просто тыкнуть где искать. Очень прошу.

Не знаю как насчет Axis, но вообще сериализация в веб-сервисах делается через jaxb (shema <-> java classes). Так что попробуй выдрать схему из wsdl и сериализуй из-в нее.

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

Для меня jaxb не подходит по причине того что при генерации из wsdl, выдает ошибки вида: "... is already defined". Хотя в wsdl все определено правильно. Axis генерирует классы нормально. Правда возникла проблема сериализовать обратно в xml.

signal2564
() автор топика
Ответ на: комментарий от Nagwal

Попробовал XStream. Столкнулся с такой проблемой: как обернуть сгенерированый xstream'ом код в SOAPMessage. Печально что он не умеет как marshaller записывать в SOAPBody. Любо я просто не нашел. Подскажите с помощью чего это можно сделать.

signal2564
() автор топика
Ответ на: комментарий от signal2564

Самый простой способ, что называется «в лоб» - генерить SOAPBody руками. Держи в памяти шаблон и через банальный dom api впихивай туда нужные куски.

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

Спасибо за ответ.

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

signal2564
() автор топика
Ответ на: комментарий от signal2564

JAXBContext.newInstance(DataBean.class).createMarshaller().marshal(bean, writer);

и да, не используйте axis, если есть возможность, берите jax-ws

JFreeM ★★★☆
()

Я продвинулся до того что смог сделать soap-запрос. Я получил ответ, его мне нужно десериализовать. Использую тот же JAXB, с его marshaller'ами получаю exception:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://ws.unisoft/", local:«SendFullULRequest»). Expected elements are <{http://www.w3.org/2004/08/xop/include}Include...

В гугле, все ссылки ведут на информацию, которая уже поправлена у меня. Декларация @XmlRootElement не дает нужных результатов. В package-info.java namespace прописан, с параметром javax.xml.bind.annotation.XmlNsForm.QUALIFIED.

package-info

@javax.xml.bind.annotation.XmlSchema(namespace = "http://ws.unisoft/", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package unisoft.ws;

unparser

private static Object DocumentToClass(InputStream input, Class clazz) {
        try {         
            JAXBContext context = JAXBContext.newInstance(clazz);
            Unmarshaller um = context.createUnmarshaller();
            Object m = um.unmarshal(input);
            return m;
        } catch (JAXBException e) {
            e.printStackTrace(System.err);
            return false;
        }
    }

фрагмент с распарсингом

Object request = DocumentToClass(new FileInputStream("C:\\gos\\SID0003292_rar\\SID0003292\\exampleSendFullUlRequest.xml"), FullULRq.class);

что парсится

<SendFullULRequest xmlns="http://ws.unisoft/">
	<smev:Message xmlns:smev="http://testurl.ru/rev110801">
		<smev:Sender>
			<smev:Code>13242</smev:Code>
			<smev:Name>MINSVYAZ_SYS_1</smev:Name>
		</smev:Sender>
		<smev:Recipient>
			<smev:Code>13312</smev:Code>
			<smev:Name>NALOG_SYS_1</smev:Name>
		</smev:Recipient>
		<smev:Originator>
			<smev:Code>originator_code</smev:Code>
			<smev:Name>ПГУ</smev:Name>
		</smev:Originator>
		<smev:TypeCode>5</smev:TypeCode>
		<smev:Date>2011-08-17T09:30:47Z</smev:Date>
	</smev:Message>
	<smev:MessageData xmlns:smev="http://testurl.ru/rev110801">
		<smev:AppData wsu:Id="fns-AppData">
			<Документ xmlns="http://ws.unisoft/EGRNXX/FullULReq" ВерсФорм="4.01" ИдДок="fef858cb-ad4f-45dc-a7e1-6816e3bcb1d4" НомерДела="55">
			<СвЮЛ ИННЮЛ="1234567890" НаимЮЛ="Организация" ОГРН="1234567890123" ОКОГУ="14003"/>
			<ЗапросЮЛ>
				<ОГРН>1023302752021</ОГРН>
			</ЗапросЮЛ>
			</Документ>
		</smev:AppData>
	</smev:MessageData>
</SendFullULRequest>

из чего спарсились классы http://94.125.90.50:6336/FNSEGRNSWS/FNSEGRService?wsdl

Помогите пожалуйста с этой проблемой.

signal2564
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.