覆盖Weblogic 10使用的JAX-WS版本-具有内联模式的动态WSDL [英] Override JAX-WS version used by Weblogic 10 - Dynamic WSDL with inline schemas

查看:118
本文介绍了覆盖Weblogic 10使用的JAX-WS版本-具有内联模式的动态WSDL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人成功更新了Weblogic 10.3.3使用的JAX-WS版本吗?

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

我一直在尝试执行

I've been trying to do what's described in the accepted answer from here for hours with no luck.

我正在使用Maven来解决依赖关系,并且在WAR模块(Web服务项目)中尝试了以下库的组合:

I'm using Maven to resolve my dependencies and I've tried with 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>

基本上,这是在我的应用程序中附带较新版本的JAX-WS.

That is basically to ship a newer version of JAX-WS with my application.

在EAR模块中,我玩过weblogic-application.xml文件,它覆盖了不同的包:

In my EAR module I've 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>

这表示Weblogic使用我的类而不是它本身具有的类.

That is to indicate Weblogic to use my classes instead of the classes it has in itself.

当前,我的Weblogic 10.3.3使用的是JAX-WS 2.1.5,当我部署Web服务时,它会动态生成一个wsdl文件,该生成的wsdl正在导入xsds(方案),我想告诉Weblogic生成该文件. wsdl与内联架构,这就是为什么我试图覆盖使用的JAX-WS版本,希望更新的版本使用内联架构.

Currently my Weblogic 10.3.3 is using JAX-WS 2.1.5 and when I deploy a web service it dynamically generates a wsdl file, the generated wsdl is importing xsds (schemas) and I would like to tell Weblogic to generate the wsdl with inline schemas, that's why I'm trying to override the used JAX-WS version hoping a more recent version uses inline schemas.

另一种选择是在开发过程中使用内联模式生成wsdl,并以某种方式告诉Weblogic使用该wsdl而不是生成动态版本,有人知道该怎么做吗?是否将其放在WAR的特定路径上? @WebService批注中的wsdlLocation属性如何?

Another option would be to generate the wsdl with inline schemas during development and somehow tell Weblogic to use that one instead of generating a dynamic version, do anyone know how to do that? is it putting it in a specific path on the WAR? what about the wsdlLocation attribute on the @WebService annotation?

提前谢谢!

推荐答案

我能够在Weblogic 10.3.5中运行JaxWs 2.2.6. 我知道您正在使用10.3.3,但此解决方案也应该可以使用.

I was able to get JaxWs 2.2.6 running in Weblogic 10.3.5 I know your are working on 10.3.3 but this solution should also work.

我遵循了METRO讨论中的步骤: http://www.java.net/node/695058#comment-772902

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 the description what I have done.

战争文件的步骤

1)将您的Web服务打包为war文件

1) Package your webservice as war file

2)在war文件中,您需要在WEB-INF目录下有一个sun-jaxws.xml文件(有关详细信息,请参见:http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/2.0/jaxws/jaxws-war.html)

2) in the war file you need a sun-jaxws.xml file under WEB-INF directory (for detailed information look here: http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/2.0/jaxws/jaxws-war.html)

3)将wsdl和xsd文件放在WEB-INF/wsdl下

3) place the wsdl and xsd file under WEB-INF/wsdl

4)在web.xml
中注册WSServletWSServletContextListener (有关帮助,请参见 http://java.dzone.com/articles/jax-ws-deployment-五分钟)

4) register WSServlet and WSServletContextListener in your web.xml
(for some help look 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)在WEB-INF/classes/META-INF/services

我用过javax.xml.ws.spi.Provider
并作为文件中的内容(提供程序的Impl类):com.sun.xml.ws.spi.ProviderImpl
您可以从jaxws-rt.jar
获取此文件 还将其他服务文件放在这里(例如,用于不同的XeceresParserFactory)

i used javax.xml.ws.spi.Provider
and as content in the file (impl class of the provider): com.sun.xml.ws.spi.ProviderImpl
you can get this file from jaxws-rt.jar
place also other service files here (for example for different XeceresParserFactory)

原因:Weblogic在运行时生成名为_wl_cls_gen.jar的文件.在这里,它首先查找服务文件.当weblogic找到服务文件时,所有其他文件都会从jar文件中加载(如预期的那样). 至少它的行为是这样的

reason: Weblogic generates at runtime a file called: _wl_cls_gen.jar . And here it looks for service files in the first place. When weblogic founds a service file there all other files are loaded from from jar files as espected. at least it behaves like this

6)创建一个weblogic.xml<prefer-web-inf-classes>false</prefer-web-inf-classes>设置为false

6) Create a 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>

战争档案的结构:

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

获取耳朵文件的步骤

1)将战争文件打包到耳朵文件中

1) Pack your war file in an ear file

2)将JaxWs Service Finder类放在APP-INF/classes下 您可以使用JaxWs-rt.jar

2) Place a JaxWs Service Finder class under APP-INF/classes you can use the existing class files from JaxWs-rt.jar

3)将jaxws-rt,所有依赖项以及xerces-2.9.1和xalan-2.7.1放在APP-INF/lib

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

4)创建一个application.xml文件

<?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)创建一个weblogic-application.xml文件

<?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>    

注意:在APP-INF/lib下的耳朵文件中的jar不应在WEB-INF/lib

Attention: jars which are in ear file under APP-INF/lib should not be in war file under WEB-INF/lib

耳锉的结构:

|-> 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

现在将您的Ear文件部署到weblogic.

Now deploy your ear file to weblogic.

当您打开wsdl文件http://localhost:7001/MyWebService/MyWebService?wsdl时,您应该看到以下注释:

when you open your 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's version is JAX-WS RI 2.2.6b21  svn-revision#12959. -->

希望这个方法/在某种程度上很有用.

hope this how-to is/was somehow usefull.

有关一些调试信息,我将此添加到了ServiceImpl类中:

for some debug informations 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;
}

致谢 亚历克斯

PS:作为新用户,我仅允许发布2个超链接,请原谅...

PS: As a new user i#m only allowed to post 2 hyperlinks, please excuse this...

这篇关于覆盖Weblogic 10使用的JAX-WS版本-具有内联模式的动态WSDL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆