Override JAX-WS Version Used by Weblogic 10 - Dynamic WSDL with Embedded Schemas

Has anyone successfully updated the version of JAX-WS used by Weblogic 10.3.3?

I tried to do what is described in the accepted answer here for hours with no luck.

I use Maven to solve my dependencies, and I tried to use combinations of the following libraries in my WAR module (web service project):

<dependency> <groupId>javax.xml.ws</groupId> <artifactId>jaxws-api</artifactId> <version>2.2.8</version> </dependency> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>2.2.7</version> </dependency> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.jws</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>org.glassfish.metro</groupId> <artifactId>wsit-api</artifactId> <version>2.2.1-1</version> </dependency> <dependency> <groupId>org.glassfish.metro</groupId> <artifactId>wsit-impl</artifactId> <version>2.2.1-1</version> </dependency> 

This is mainly for sending a new version of JAX-WS with my application.

In my EAR module, I played with the weblogic-application.xml file, overriding different packages:

  <package-name>javax.jws.*</package-name> <package-name>javax.xml.ws.*</package-name> <package-name>javax.xml.bind.*</package-name> <package-name>javax.xml.soap.*</package-name> <package-name>com.sun.xml.*</package-name> 

This means that Weblogic uses my classes instead of the classes that it itself has.

Currently my Weblogic 10.3.3 uses JAX-WS 2.1.5, and when I deploy the web service, it dynamically generates a wsdl file, the generated wsdl imports xsds (schemas), and I would like to tell Weblogic to create wsdl with embedded schemas so I am trying to override the version of JAX-WS being used, hoping that the newer version uses the built-in schemas.

Another option would be to generate wsdl with embedded circuits during development and somehow tell Weblogic to use this option instead of generating a dynamic version, does anyone know how to do this? Does he put it on a specific path in the WAR? what about the wsdlLocation attribute in the @WebService annotation?

Thanks in advance!

+7
source share
2 answers

I managed to run JaxWs 2.2.6 on Weblogic 10.3.5. I know that you are working on 10.3.3, but this solution should also work.

I followed the steps from this METRO discussion: http://www.java.net/node/695058#comment-772902

Not all steps from there are really required. So, here is a description of what I did.

Steps for a war file

1) Package your web service as a war file

2) in the military file, you need the sun-jaxws.xml file in the WEB-INF directory (for more information see here: http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/2.0/jaxws/jaxws-war.html )

3) put the wsdl and xsd file in the WEB-INF / wsdl section

4) register WSServlet and WSServletContextListener in web.xml
(for some help see here http://java.dzone.com/articles/jax-ws-deployment-five-minute )

 <listener> <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> </listener> <servlet> <servlet-name>MyWebService</servlet-name> <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>MyWebService</servlet-name> <url-pattern>/MyWebService</url-pattern> </servlet-mapping> 

5) Put at least one service file in WEB-INF/classes/META-INF/services

I used javax.xml.ws.spi.Provider
and as the contents in the file (provider type class): com.sun.xml.ws.spi.ProviderImpl
you can get this file from jaxws-rt.jar
post other utility files here (for example, for different XeceresParserFactory)

reason : Weblogic generates a runtime file named: _wl_cls_gen.jar . And here he searches for service files in the first place. When weblogic detects a service file, all other files are loaded from jar files, as expected. at least that’s how it behaves

6) Create weblogic.xml set <prefer-web-inf-classes>false</prefer-web-inf-classes> to false

 <?xml version="1.0" encoding="UTF-8"?> <weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.2/weblogic-web-app.xsd"> <context-root>/LogisticsWebservice</context-root> <container-descriptor> <prefer-web-inf-classes>false</prefer-web-inf-classes> </container-descriptor> </weblogic-web-app> 

The structure of the military file:

 WEB-INF |-> classes |-> META-INF |-> services |-> javax.xml.ws.spi.Provider |-> lib |-> alle projektspezifischen jars außer die Abhängigkeiten für JaxWS |-> wsdl |-> MyWebService.wsdl |-> MyObjects.xsd |-> sun-jaxws.xml |-> web.xml |-> weblogic.xml 

Steps for Ear File

1) Pack your war file in the ear file

2) Put the JaxWs lookup class in APP-INF/classes you can use existing class files from JaxWs-rt.jar

3) Put jaxws-rt, all dependencies and xerces-2.9.1 and xalan-2.7.1 in APP-INF/lib

4) Create application.xml file

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" "http://java.sun.com/dtd/application_1_3.dtd"> <application> <display-name>MyWebService</display-name> <module id="MyWebService"> <web> <web-uri>MyWebService.war</web-uri> <context-root>/MyWebService</context-root> </web> </module> </application> 

5) Create a weblogic-application.xml file

 <?xml version="1.0" encoding="UTF-8"?> <weblogic-application xmlns="http://xmlns.oracle.com/weblogic/weblogic-application" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.2/weblogic-application.xsd"> <application-param> <param-name>webapp.encoding.default</param-name> <param-value>UTF-8</param-value> </application-param> <prefer-application-packages> <package-name>com.ctc.*</package-name> <package-name>com.sun.xml.*</package-name> <package-name>com.sun.istack.*</package-name> <package-name>com.sun.msv.datatype.*</package-name> <package-name>com.sun.msv.driver.*</package-name> <package-name>com.sun.msv.grammar.*</package-name> <package-name>com.sun.msv.reader.*</package-name> <package-name>com.sun.msv.relaxns.*</package-name> <package-name>com.sun.msv.scanner.*</package-name> <package-name>com.sun.msv.util.*</package-name> <package-name>com.sun.msv.verifier.*</package-name> <package-name>com.sun.msv.writer.*</package-name> <package-name>com.sun.org.apache.xml.internal.*</package-name> <package-name>com.sun.wsit.*</package-name> <package-name>javax.jws.*</package-name> <package-name>javax.xml.bind.*</package-name> <package-name>javax.xml.soap.*</package-name> <package-name>javax.xml.stream.*</package-name> <package-name>javax.xml.ws.*</package-name> <package-name>javax.xml.activation.*</package-name> <package-name>javax.xml.annotation.*</package-name> <package-name>javax.xml.mail.*</package-name> <package-name>javax.xml.security.*</package-name> <package-name>javax.xml.registry.*</package-name> <package-name>javax.xml.rpc.*</package-name> <package-name>javax.xml.crypto.*</package-name> <package-name>org.apache.xerces.*</package-name> <package-name>javanet.staxutils.*</package-name> <package-name>jp.gr.xml.*</package-name> <package-name>org.codehaus.stax2.*</package-name> <package-name>org.glassfish.gmbal.*</package-name> <package-name>org.iso_relax.*</package-name> <package-name>org.jcp.xml.dsig.*</package-name> <package-name>org.jvnet.*</package-name> <package-name>org.relaxng.*</package-name> </prefer-application-packages> <prefer-application-resources> <resource-name>META-INF/services/*</resource-name> </prefer-application-resources> </weblogic-application> 

Attention : banks located in the ear file under APP-INF/lib should not be in the military file under WEB-INF/lib

Ear File Structure:

 |-> APP-INF |-> classes |-> com |-> sun |-> xml |-> ws |-> util |-> ServiceFinder.class |-> ServiceFinder$1.class |-> ServiceFinder$ComponentExWrapper.class |-> ServiceFinder$CompositeIterator.class |-> ServiceFinder$LazyIterator.class |-> lib |-> activation-1.1.jar |-> gmbal-api-only-3.1.0-b001.jar |-> ha-api-3.1.8.jar |-> istack-commons-runtime-2.4.jar |-> javax.annotation-3.1.1.jar |-> jaxb-api-2.2.4.jar |-> jaxb-impl-2.2.5.jar |-> jaxws-api-2.2.8.jar |-> jaxws-rt-2.2.6.jar |-> jsr181-api-1.0-MR1.jar |-> management-api-3.0.0-b012.jar |-> mimepull-1.8.jar |-> policy-2.3.1.jar |-> relaxngDatatype-20020414.jar |-> resolver-20050927.jar |-> saaj-api-1.3.4.jar |-> saaj-impl-1.3.18.jar |-> serializer-2.7.1.jar |-> stax-api-1.0-2.jar |-> stax-ex-1.7.jar |-> stax2-api-3.1.1.jar |-> streambuffer-1.4.jar |-> txw2-20110809.jar |-> woodstox-core-asl-4.1.2.jar |-> xalan-2.7.1.jar |-> xercesImpl-2.9.1.jar |-> xml-apis-1.3.04.jar |-> META-INF |-> application.xml |-> weblogic-application.xml |-> MyWebService.war 

Now deploy your ear file to weblogic.

when you open the wsdl file http://localhost:7001/MyWebService/MyWebService?wsdl , you should see this comment:

 <!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI version is JAX-WS RI 2.2.6b21 svn-revision#12959. --> 

I hope this somehow / was somehow useful.

for some debugging data, I added this to my ServiceImpl class:

 private static String getImplementationInfo(String componentName, @SuppressWarnings("rawtypes") Class componentClass) { CodeSource source = componentClass.getProtectionDomain().getCodeSource(); return MessageFormat.format( "{0} implementation: {1} loaded from: {2}", componentName, componentClass.getName(), source == null ? "Java Runtime" : source.getLocation()); } public MyWebServiceResponse sayHello(MyWebServiceRequest request) throws MyWebServiceFault if (LOG.isDebugEnabled()) { com.sun.xml.ws.util.Version jaxwsVersion = com.sun.xml.ws.util.Version.RUNTIME_VERSION; LOG.debug("JaxWS major=" + jaxwsVersion.MAJOR_VERSION + "; buildVersion=" + jaxwsVersion.BUILD_VERSION + "; buildId=" + jaxwsVersion.BUILD_ID + "; svnRev" + jaxwsVersion.SVN_REVISION); LOG.debug(getImplementationInfo("JaxWS", com.sun.xml.ws.util.Version.class)); LOG.debug(getImplementationInfo("JaxB", com.sun.xml.bind.Util.class)); LOG.debug(getImplementationInfo("DocumentBuilderFactory", DocumentBuilderFactory.newInstance().getClass())); LOG.debug(getImplementationInfo("XPathFactory", XPathFactory.newInstance().getClass())); LOG.debug(getImplementationInfo("TransformerFactory", TransformerFactory.newInstance().getClass())); LOG.debug(getImplementationInfo("SAXParserFactory", SAXParserFactory.newInstance().getClass())); } // do something return myWebServiceResponse; } 

Regards Alex

PS: As a new user, I'm # m allowed to post only 2 hyperlinks, please excuse me ...

+6
source

I used this solution and was able to get this working ... But the problem is that I need to send the proper client certificate in order to create my own SSLSocketFactory, which I assigned to the binding: bp.getRequestContext (). put (JAXWSProperties.SSL_SOCKET_FACTORY, fact.getSSLSocketFactory ());

The problem is that weblogic is not using it. It uses its own HTTPsConnection with a standard factory. I tried to implement weblogic SSLSocketFactory, but obligatory, complains that this is not a sun class.

After a lot of time wasted, I created a call pattern (running my code as standalone), then I use XML to replace / update the nodes (+ action in the http header). It works well, and I got rid of all the changes that are where necessary. I know this is a little radical, but to be honest, it works very well to make a call.

+1
source

All Articles