您的位置:

使用SpringBoot Webservice进行接口开发与调用

SpringBoot Webservice 是 Spring Framework 的重要组成部分,提供了轻量级的模块化解决方案,并且能够快速构建各种 RESTful 模式的 Web Services 以便与其他系统进行通信。

本文将从如下几个方面对 SpringBoot Webservice 进行详细的阐述:

一、SpringBoot Webservice 简介

Spring Framework 是主要用于企业级 Java 应用程序的一个开源框架。SpringBoot Webservice 是其重要组成部分,通过提供模块化的轻量级解决方案,能够快速构建各种形式的 Web 服务。在 SpringBoot 中使用 Web Service 的最大优势之一是其模块化,这意味着你可以只使用你需要的部分,而且这些部分在运行时被自动装配。SpringBoot Webservice 还能够很好地与 JAX-WS 和 JAXB 编组等标准结合使用,满足不同的应用需求。

二、SpringBoot Webservice 接口调用

1、使用 CXF 客户端进行调用

@Bean
public JaxWsProxyFactoryBean jaxWsProxyFactoryBean() {
    JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
    factoryBean.setServiceClass(Calculator.class);
    factoryBean.setAddress("http://localhost:8080/calculator");
    return factoryBean;
}

@Autowired
private JaxWsProxyFactoryBean jaxWsProxyFactoryBean;

@Test
public void testAdd() {
    Calculator calculator = jaxWsProxyFactoryBean.create(Calculator.class);
    assertEquals(calculator.add(10, 20), 30);
}

2、使用 SoapUI 进行调用

SoapUI 是一种非常强大的 Soap API 测试工具。它可以用于测试 Web 服务、RESTful API 以及其他类型的 Web API。使用 SoapUI 进行测试可以模拟发送请求的过程,使你可以快速识别潜在的问题。

3、使用 Java 应用程序进行调用

使用 Java 应用程序调用 SpringBoot Webservice 接口的最简单方法是使用 SAAJ API。简单说来,SAAJ 是一个在 Java 中构建 SOAP 消息的标准 API。以下是一个简单的示例:

@WebService(endpointInterface = "com.example.demo.service.Calculator")
public class CalculatorImpl implements Calculator {
    @Override
    public int add(int a, int b) {
        return a + b;
    }
}

SoapConnectionFactory soapConnectionFactory = SoapConnectionFactory.newInstance();
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPConnection connection = soapConnectionFactory.createConnection();
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
SOAPHeader soapHeader = soapEnvelope.getHeader();
SOAPBody soapBody = soapEnvelope.getBody();
SOAPElement soapElement = soapBody.addChildElement("add", "ns1", "http://www.example.org/service");
SOAPElement soapChildElement1 = soapElement.addChildElement("arg0");
SOAPElement soapChildElement2 = soapElement.addChildElement("arg1");
soapChildElement1.addTextNode("10");
soapChildElement2.addTextNode("20");
URL endpoint = new URL("http://localhost:8080/calculator");
SOAPMessage response = connection.call(soapMessage, endpoint);
SOAPBody responseBody = response.getSOAPBody();
SOAPElement responseElement = (SOAPElement) responseBody.getChildElements().next();
String result = responseElement.getValue();
assertEquals(Integer.parseInt(result), 30);

三、SpringBoot Webservice 接口开发

1、基本注解

在 SpringBoot Webservice 中,有很多注解可以用来处理实现 Web Service 的 Java 类。其中最常用的是 @WebService,用于将一个 Java 类标记为 Web Service。以下是一个简单的 @WebService 标注的例子:

@WebService(endpointInterface = "com.example.demo.service.Calculator")
public class CalculatorImpl implements Calculator {
    @Override
    public int add(int a, int b) {
        return a + b;
    }
}

2、@WebService 注解属性

@WebService 提供了很多属性,用于调整 Web Service 的行为。以下是常见的一些:

  • name:指定 Web Service 的名称。
  • portName:指定端口的名称。
  • serviceName:指定 Service 的名称。
  • targetNamespace:指定 XML 中的命名空间。

3、如何发布 Web 服务

通过使用 SpringBoot 功能,可以在 Web 容器中轻松发布 Web 服务。定义一个新的 SpringBoot 应用程序,并且在其 main 类中添加以下内容:

@Endpoint
public class Calculator {
    @PayloadRoot(localPart = "add", namespace = "http://www.example.org/service")
    @ResponsePayload
    public AddResponse add(@RequestPayload Add request) {
        AddResponse response = new AddResponse();
        response.setResult(request.getArg0() + request.getArg1());
        return response;
    }
}

@Bean
public ServletRegistrationBean messageDispatcherServlet() {
    MessageDispatcherServlet servlet = new MessageDispatcherServlet();
    servlet.setTransformWsdlLocations(true);
    return new ServletRegistrationBean<>(servlet, "/demo/*");
}

@Bean(name = "demo")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema schema) {
    DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
    wsdl11Definition.setPortTypeName("Calculator");
    wsdl11Definition.setLocationUri("/demo");
    wsdl11Definition.setTargetNamespace("http://www.example.org/service");
    wsdl11Definition.setSchema(schema);
    return wsdl11Definition;
}

@Bean
public XsdSchema schema() {
    return new SimpleXsdSchema(new ClassPathResource("demo.xsd"));
}

  

4、在 Web 服务中使用 Spring Security

Spring Security 是一个可定制的安全框架,用于保护 Spring 应用程序中的 Web 资源。下面是如何使用 Spring Security 在 Web 服务中进行身份验证的一个简单示例:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .httpBasic();
    }
}

四、SpringBoot Webservice 示例代码

完整代码请访问:https://github.com/coolspan/springboot-webservice-example