二十九、SpringbootはWebサービスを統合し、SOAPサービスを構築する
(一)依存の追加
(二)SOAPサービスの作成
1、Schemaファイルの作成
2、javaファイルに変換する
変換方法15、作成したschema(*.xsd)に基づいて対応するjavaエンティティを生成する
3、倉庫の作成
4、endpointの作成
5、Webサービス構成クラスの作成
6.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);
}
}