二十九、Springboot整合Web services,构建SOAP服务

(一)添加依赖

        
			org.springframework.boot
			spring-boot-starter-web-services
		

		
			wsdl4j
			wsdl4j
			1.6.3
		

(二)创建SOAP服务端

1、编写Schema文件



    
    
        
            
            
            
            
        
    

    
        
            
                
                
            
        
    

    
        
            
                
                
            
        
    

2、将其转换成java文件

    转换办法参见十五、根据编写的schema(*.xsd)来生成对应的java实体

3、创建仓储

@Repository
public class UserRepository {
    private Map cachedUsers = new HashMap<>();
    @PostConstruct
    public void init(){
        User user1 = createUser("1", "潘畅", 25);
        User user2 = createUser("2", "刘德华", 26);
        User user3 = createUser("3", "黄晓明", 27);
        /**
         * 知识点:
         */
        cachedUsers.put("1", user1);
        cachedUsers.put("2", user2);
        cachedUsers.put("3", user3);
    }
    private User createUser(String id, String name, Integer age){
        User user = new User();
        user.setId(id);
        user.setName(name);
        user.setAge(age);

        return user;
    }

    public User findById(String id){
        return cachedUsers.get(id);
    }
}

4、创建endpoint

/**
 * 用户服务的Endpoint(端点)
 */
@Endpoint
public class UserServiceEndpoint {
    private UserRepository userRepository;
    @Autowired
    public UserServiceEndpoint(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    /**
     * namespace = "http://segmentfault.com/schemas":同user.xsd文件中的targetNamespace属性
     * @ResponsePayload类似于@ResponseBody注解
     * @RequestPayload类似于@RequestBody注解
     */
    @PayloadRoot(namespace = "http://segmentfault.com/schemas", localPart = "UserIdRequest")
    @ResponsePayload
    public UserResponse getUser(@RequestPayload UserIdRequest userIdRequest){
        String userId = userIdRequest.getUserId();
        long timeStamp = userIdRequest.getTimeStamp();
        /**
         * JDK1.8出品:线程安全
         */
        Instant instant = Instant.ofEpochMilli(timeStamp);
        //转换成本地时区
        ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());

        System.out.println("web service 用户ID:" + userId + ",请求的时间:" + zonedDateTime);
        User user = userRepository.findById(userId);
        UserResponse userResponse = new UserResponse();
        userResponse.setUser(user);
        userResponse.setTimeStamp(Instant.now().toEpochMilli());
        return userResponse;
    }
}

5、创建Web services配置类

/**
 * web service 配置类
 */
@Configuration
public class WebServicesConfiguration extends WsConfigurerAdapter {
    /**
     *     设置访问路径:@Bean("my"),案例:http://localhost:8080/test/ws/my.wsdl,
     * 其中,wsdl是MessageDispatcherServlet中规定的结尾
     * @param userXsdSchema @Autowired自动装配下方的userXsdSchema
     * @return Wsdl11Definition对象
     */
    @Bean("my")
    @Autowired
    public Wsdl11Definition userWsdl11Definition(XsdSchema userXsdSchema){
        DefaultWsdl11Definition defaultWsdl11Definition = new DefaultWsdl11Definition();

        defaultWsdl11Definition.setPortTypeName("UserServicePort");
        //设置访问路径:@Bean("my"),案例:http://localhost:8080/test/ws/my.wsdl
        defaultWsdl11Definition.setLocationUri("/ws");
        //user.xsd中的targetNamespace属性
        defaultWsdl11Definition.setTargetNamespace("http://segmentfault.com/schemas");
        defaultWsdl11Definition.setSchema(userXsdSchema);

        return defaultWsdl11Definition;
    }

    /**
     * 注册user.xsd(Schema文件)对应的java对象
     */
    @Bean
    public XsdSchema userXsdSchema(){
        return new SimpleXsdSchema(new ClassPathResource("META-INF/schemas/user.xsd"));
    }
}

6、配置Web servicesfang访问根路径

spring:
  webservices:
    #自定义访问路径前缀,比如这里的访问实例:http://localhost:8080/test/ws/my.wsdl
    path: /test

        到这里,服务端就创建完毕了!

(三)创建SOAP客户端

/**
 * Web Service 客户端(Spring 实现)
 */
public class WebServicesClient {
    public static void main(String[] args) {
        WebServiceTemplate webServiceTemplate = new WebServiceTemplate();

        Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
        jaxb2Marshaller.setClassesToBeBound(UserIdRequest.class, UserResponse.class, User.class);

        webServiceTemplate.setMarshaller(jaxb2Marshaller);
        webServiceTemplate.setUnmarshaller(jaxb2Marshaller);

        //构造 SOAP 请求
        UserIdRequest userIdRequest = new UserIdRequest();
        userIdRequest.setUserId("1");
        userIdRequest.setTimeStamp(Instant.now().toEpochMilli());

        /**
         * http://localhost:8080/test/ws/my:访问请求地址
         * http://localhost:8080/test/ws/my.wsdl:这里出现的是xml文件内容
         */
        UserResponse userResponse = (UserResponse) webServiceTemplate.marshalSendAndReceive(
                "http://localhost:8080/test/ws/my", userIdRequest);

        System.out.println(userResponse);
    }
}

 

你可能感兴趣的:(Spring,Boot,从入门到放弃)