使用Spring和Embedded Jetty 8发布JAX-WS服务

时间:2012-07-10 21:00:20

标签: spring maven jax-ws netbeans-7 embedded-jetty

我正在尝试将JAX-WS Web服务添加到我的Embedded Jetty应用程序中。 Web服务客户端将是.NET应用程序。

我的项目是在Netbeans 7.1.1中创建的Maven应用程序。它使用Spring 3.0。

我采取了以下步骤将JAX-WS添加到我的应用程序中:

  1. 在pom.xml中添加了jaxws-spring。

    <dependency>
        <groupId>org.jvnet.jax-ws-commons.spring</groupId>
        <artifactId>jaxws-spring</artifactId>
        <version>1.8</version>
        <exclusions>
            <exclusion>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  2. 在我的Spring Web服务上下文中,配置WSSpringServlet。

    webservicesContext.addServlet(new ServletHolder(new WSSpringServlet()), "/service/*");
    
  3. 为我的服务创建了一个实现类。

    @WebService(name = "GenerateUEIDService")
    public class GenerateUEIDService {
    
        @WebMethod(operationName = "generateUniqueIds")
        public String generateUniqueIds() {
            return "Hello World";
        }
    
    }
    
  4. 在Spring applicationContext.xml文件中配置我的服务。

    <bean id="generateUEIDService" class="com.mycompany.GenerateUEIDService"/>
    
    <wss:binding url="/service/GenerateUEID.svc">
     <wss:service>
      <ws:service bean="#generateUEIDService" />
     </wss:service>
    </wss:binding>  
    
  5. 我没有在Netbeans中使用任何Web服务创建向导来执行上面的步骤3。相反,我创建了GenerateUEIDService作为普通的Java类,但添加了注释。即使我没有Netbeans以某种方式检测到这是一个Web服务,因为它在项目视图中创建了一个“Web服务”节点,其下面有“GenerateUEIDServiceService”。如果我展开GenerateUEIDServiceService,我会看到“generateUniqueIds:String”。

    似乎很好。但是当我运行应用程序时,我得到了:

      

    com.sun.xml.ws.model.RuntimeModelerException:运行时建模器错误:包装器类   找不到com.mycompany.jaxws.GenerateUniqueIds。你有没有运行APT来生成它们?

    嗯不,我没有运行APT来生成任何东西。鉴于我的配置,我该怎么做?我是否需要在pom.xml中添加插件?或者Netbeans是否真的应该为我生成包装?

    请注意,我的Web服务客户端将是.NET。所以我假设我应该使用document / literal包装的默认SOAPBinding。

2 个答案:

答案 0 :(得分:1)

我决定创建一个简单的Netbeans Maven java应用程序,以查看是否会自动生成该服务的包装类。事实证明,它们是在运行时由JAX-WS运行时动态创建的。

[exec:exec]
Jul 12, 2012 8:30:05 AM com.sun.xml.internal.ws.model.RuntimeModeler getRequestWrapperClass
INFO: Dynamically creating request wrapper Class com.mycompany.mavenjaxwsjetty.jaxws.Greet
Jul 12, 2012 8:30:05 AM com.sun.xml.internal.ws.model.RuntimeModeler getResponseWrapperClass
INFO: Dynamically creating response wrapper bean Class com.mycompany.mavenjaxwsjetty.jaxws.GreetResponse

回到原来的申请表(来自上面的原始帖子)。我出于无关的原因删除了jaxws-spring的东西。我可能做了一些我不记得的其他改变。现在,当我运行该应用程序时,我可以在日志中看到正在创建包装类。

所以我想我的问题的答案是Netbeans不会为我神奇地创建包装类,而是jax-ws运行时。

我仍然想知道在什么情况下不会自动为我生成包装类。或者当我想使用wsgen或maven-jaxb2-plugin生成自己的时候。像往常一样,我想有不止一种方法可以“给猫皮肤”,每种方法都有其优点和缺点。

答案 1 :(得分:0)

您可以使用Maven插件生成jaxb类。它应该是这样的:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.8.1</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <!--
        <generatePackage>if you wan to force the package</generatePackage>
        -->
        <generateDirectory>target/jaxb/generate/</generateDirectory>
        <schemaDirectory>src/main/webapp/WEB-INF/</schemaDirectory>
        <includeSchemas>
            <includeSchema>yourXSDfile.xsd</includeSchema>
        </includeSchemas>
    </configuration>
</plugin>