Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring JAXWS与SimpleJaxWsServiceExporter-JaxWsPortProxyFactoryBean的最佳实践_Java_Spring_Web Services_Jax Ws - Fatal编程技术网

Java Spring JAXWS与SimpleJaxWsServiceExporter-JaxWsPortProxyFactoryBean的最佳实践

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

我从一本名为《行动中的春天4》的书中学习春天。 我实际上在做webservice部分;特别是“发布和使用web服务”

在本书之后,我已经能够通过以下方式设置一个JAX-WS web服务

服务器端

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