Java Spring JAXWS与SimpleJaxWsServiceExporter-JaxWsPortProxyFactoryBean的最佳实践
我从一本名为《行动中的春天4》的书中学习春天。 我实际上在做webservice部分;特别是“发布和使用web服务” 在本书之后,我已经能够通过以下方式设置一个JAX-WS web服务: 服务器端:Java Spring JAXWS与SimpleJaxWsServiceExporter-JaxWsPortProxyFactoryBean的最佳实践,java,spring,web-services,jax-ws,Java,Spring,Web Services,Jax Ws,我从一本名为《行动中的春天4》的书中学习春天。 我实际上在做webservice部分;特别是“发布和使用web服务” 在本书之后,我已经能够通过以下方式设置一个JAX-WS web服务: 服务器端: SpitrServiceImpl:公开JAX-WS服务的类 @Component @WebService(serviceName="SpittrService") public class SpittrServiceImpl { @Autowired Spit
SpitrServiceImpl
:公开JAX-WS服务的类
@Component
@WebService(serviceName="SpittrService")
public class SpittrServiceImpl {
@Autowired
SpitterRepository spitterRepository;
@Autowired
SpittleRepository spittleRepository;
@WebMethod
public String helloService() { return "Hello world"; }
@WebMethod
public Spitter showSpitterProfile(String username) {
Spitter spitter = spitterRepository.findByUsername(username);
spitter.setSpittleList(new ArrayList<>());
System.out.println("SERVER SIDE - showSpitterProfile: " + spitter.toString());
return spitter;
}
@WebMethod
public Spittle findSpittleById(long spittleId) {
Spittle spittle = spittleRepository.findById(spittleId);
System.out.println("SERVER SIDE - findSpittleById: " + spittle.toString());
return spittle;
}
}
@Configuration
public class JAXWSConfig {
@Bean
public SimpleJaxWsServiceExporter jaxWsExporter() {
SimpleJaxWsServiceExporter exporter = new SimpleJaxWsServiceExporter();
exporter.setBaseAddress("http://localhost:8888/services/");
return exporter;
}
}
这将创建我在最后报告的WSDL
在客户端,我们有以下类别:
ClientConfig
:将代理返回到服务器端创建的WSDL的类
@Configuration
@ComponentScan(basePackages = {"spittrClient", "spittr"})
public class ClientConfig {
@Bean
public JaxWsPortProxyFactoryBean spittrService() throws MalformedURLException {
System.out.println("CREATING JAX-WS CONNECTION...");
JaxWsPortProxyFactoryBean proxy = new JaxWsPortProxyFactoryBean();
proxy.setWsdlDocumentUrl(new URL("http://localhost:8888/services/SpittrService?wsdl"));
proxy.setServiceName("SpittrService");
proxy.setPortName("SpittrServiceImplPort");
proxy.setServiceInterface(SpittrService.class);
proxy.setNamespaceUri("http://jaxws.remoting.spittr/");
System.out.println("JAX-WS CONNECTION CREATED");
return proxy;
}
}
SpitrService
:公开WSDL提供的服务方法的接口
@WebService(serviceName = "SpittrService")
public interface SpittrService {
@WebMethod
String helloService();
@WebMethod
Spitter showSpitterProfile(String username);
@WebMethod
Spittle findSpittleById(long spittleId);
}
Client
:通过JAX-WS调用服务器提供的服务的类
@组成部分
公共类客户端{
public static void main(String[] args) {
//Run the Client class directly from main method
System.out.println("CLIENT MAIN");
ApplicationContext ctx = new AnnotationConfigApplicationContext(ClientConfig.class);
SpittrService spittrService = (SpittrService) ctx.getBean(SpittrService.class);
Spitter spitter = spittrService.showSpitterProfile("PyroSandro");
System.out.println("SPITTER CALLED BY JAX-WS: " + spitter.toString());
Spittle spittle = spittrService.findSpittleById(111);
System.out.println("SPITTLE CALLED BY JAX-WS: " + spittle.toString());
}
}
一切正常,但我不喜欢它的实现。
我认为我应该在服务器端实现接口SpittrService
(在客户端),类SpittrServiceImpl
必须实现它的方法。
但是如果我创建SpittrService
接口,并从SpittrServiceImpl
将注释@WebService
和@WebMethod
移到那里,它将停止工作
另一个选项是相同的注释@WebService
和@WebMethod
放在SpittrService
接口和SpittrServiceImpl
类上,但我不知道这是否是一个好的做法(但它是有效的)
你能帮我理解我做错了什么吗?
提前谢谢
这里我报告服务器端创建的WSDL:
您不应该这样做。当您使用Web服务时,合同是WSDL。您不会从服务该Web服务的一方获得Java接口。因此,客户端和服务器上的东西应该分开,不要尝试重用。因此,一旦我完成了书中建议的ClientConfig类的设置(使用JaxWsPortProxyFactoryBean),如果不使用接口,我应该如何实现客户机类?换句话说,我如何在客户机中调用/使用web方法?