二十九、SpringbootはWebサービスを統合し、SOAPサービスを構築する


(一)依存の追加
        
			org.springframework.boot
			spring-boot-starter-web-services
		

		
			wsdl4j
			wsdl4j
			1.6.3
		

(二)SOAPサービスの作成
1、Schemaファイルの作成


    
    
        
            
            
            
            
        
    

    
        
            
                
                
            
        
    

    
        
            
                
                
            
        
    

2、javaファイルに変換する
    変換方法15、作成した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サービス構成クラスの作成
/**
 * 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サービスアクセスルートの構成
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);
    }
}