我正在尝试将JAX-WS Web服务添加到我的Embedded Jetty应用程序中。 Web服务客户端将是.NET应用程序。
我的项目是在Netbeans 7.1.1中创建的Maven应用程序。它使用Spring 3.0。
我采取了以下步骤将JAX-WS添加到我的应用程序中:
在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>
在我的Spring Web服务上下文中,配置WSSpringServlet。
webservicesContext.addServlet(new ServletHolder(new WSSpringServlet()), "/service/*");
为我的服务创建了一个实现类。
@WebService(name = "GenerateUEIDService")
public class GenerateUEIDService {
@WebMethod(operationName = "generateUniqueIds")
public String generateUniqueIds() {
return "Hello World";
}
}
在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>
我没有在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。
答案 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>