我正在尝试向SOAP Web服务发送请求.我阅读了本教程并准备了以下代码.但是,我将向多个SOAP Web服务发送不同的请求,而本教程则关注一个请求.如何使用WebserviceTemplate?发送SOAP请求?
WebServiceTemplate
SoapMessage soapMsg = new SoapMessage();
soapMsg.setUsername("Requester");
soapMsg.setPassword("Pass");
soapMsg.setLanguageCode("EN");
Request request = new Request();
request.setDeparture("FDH");
request.setDestination("HAM");
Date date = new Date();
SimpleDateFormat frm2 = new SimpleDateFormat("yyyy-MM-dd");
request.setDepartureDate(frm2.parse(frm2.format(date)));
request.setNumADT(1);
request.setNumCHD(0);
request.setNumInf(0);
request.setCurrencyCode("EUR");
request.setWaitForResult(true);
request.setNearByDepartures(true);
request.setNearByDestinations(true);
request.setRronly(false);
request.setMetaSearch(false);
soapMsg.setRequest(request);
WebServiceTemplate webServiceTemplate = new WebServiceTemplate(). //how to create object and send request!
Object response = webServiceTemplate.marshalSendAndReceive(
"https://aaa5.elsyarres.net", soapMsg);
Response msg = (Response) response;
System.err.println("size of results of wogolo:"
+ msg.getFlights().getFlight().size());
Run Code Online (Sandbox Code Playgroud) 我正在尝试在osgi环境(Liferay DXP)中使用JAXB 2.2.11。我在创建JAXBContext时遇到问题。基于在研究像发现了一些其他来源的这个和这个,我已确定,在OSGi容器中,我需要提供JAXB实例化上下文正确的类加载器。所以我有这样的代码:
ClassLoader cl package.with.jaxb.objects.ObjectFactory.class.getClassLoader();
JAXBContext jc = JAXBContext.newInstance("package.with.jaxb.objects ", cl);
这段代码导致空指针异常与以下堆栈跟踪:
Caused by: java.lang.NullPointerException
at javax.xml.bind.ContextFinder.handleClassCastException(ContextFinder.java:129)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:201)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:146)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:371)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:446)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:409)
Run Code Online (Sandbox Code Playgroud)
查看ContextFinder的源,我可以看到context在第129行中该值必须为null:
throw handleClassCastException(context.getClass(), JAXBContext.class);
我认为问题可能是我的模块依赖于jaxb-api 2.2.11,但是jaxb-impl类是由rt.jar在运行时提供的,并且可能比2.2.11更新,因为Liferay DXP在JDK 1.8上运行。为了解决这个问题,我尝试将jaxb-impl.jar 2.2.11作为依赖项包含在我的osgi模块中,并认为jaxb-api和jaxb-impl版本会匹配。之后,尝试使用与上述相同的代码创建JAXBContent会导致以下错误:
ClassCastException: attempting to cast jar:file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/rt.jar!/javax/xml/bind/JAXBContext.class to bundleresource://623.fwk616113009:13/javax/xml/bind/JAXBContext.class. Please make sure that you are specifying the proper ClassLoader.
Run Code Online (Sandbox Code Playgroud)
根据此消息的外观,实例化的JAXBContext来自通过rt.jar加载的JAXBContext版本。这让我非常困惑,因为我希望使用模块的类加载器加载的JAXBContext版本,因为我已经在模块中包含jaxb-impl.jar,并且指定了模块的类加载器为我对JAXBContext.newInstance的调用。谁能阐明我如何使jaxb 2.2.11在osgi容器中工作?
*请注意,我无法升级模块所使用的jaxb-api的版本,因为JAXB代码实际上位于需要jaxb 2.2.11的第三方jar中(目前我刚刚从等式中删除了第三方jar通过编写一些测试JAXB代码)。