이 글에서는 Spring Boot를 CXF와 통합하여 웹 서비스를 개발하는 사례를 주로 소개하고 있는데, 편집자가 보기에는 꽤 좋다고 생각해서 지금부터 공유하고 참고용으로 올려보겠습니다. 편집자를 따라가서 살펴보자.
서문
웹 서비스라고 하면 최근 몇 년간 레스트풀(restful)이 큰 인기를 끌면서 전통 비누를 대체하는 추세다. 웹 서비스이지만 몇 가지 고유한 기능이 있습니다. 또는 상대적으로 오래된 시스템은 여전히 은행 및 항공권 쿼리 인터페이스와 같은 전통적인 비누 웹 서비스를 사용합니다.
현재 이러한 상황이 발생했습니다. 시스템에서 제3자가 제공하는 비누 웹 서비스 인터페이스를 쿼리해야 하는데, 이는 이를 기존 시스템에 통합하는 것을 의미합니다.
CXF의 Spring 통합은 원래 매우 간단하지만 Spring boot를 사용하기 때문에 이전 xml 구성 방법을 사용하고 싶지 않은데 Spring boot 스타일에 따라 우아하게 통합할 수 있을까요?
물론 그렇습니다. 하지만 이에 대한 정보는 인터넷에 거의 없습니다. 많은 고민 끝에 아주 간단해 보이지만 기록을 해야겠다는 생각이 듭니다.
종속성 추가
Maven 프로젝트의 경우 첫 번째 단계는 종속성을 추가하는 것입니다. 원래 Spring 부팅 종속성 외에도 cxf 종속성도 추가해야 합니다. 🎜>
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.1.6</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.1.6</version> </dependency>
비즈니스 코드 작성
여기에서는 사용자 정보 쿼리를 예로 들어 사용자 정의 User객체:
public class User implements Serializable { private static final long serialVersionUID = -5939599230753662529L; private Long userId; private String username; private String email; private Date gmtCreate; //getter setter ...... }를 생성합니다. 다음으로 웹 서비스 서비스를 제공하기 위한 사용자 인터페이스를 만듭니다.
과 getName
두 가지 메서드가 있는데, 하나는 일반 문자열을 반환하고 다른 하나는 사용자 정의 개체를 반환합니다. getUser
@WebService public interface UserService { @WebMethod String getName(@WebParam(name = "userId") Long userId); @WebMethod User getUser(Long userId); }인터페이스가 있는 경우 물론 비즈니스 코드가 있어야 합니다. 여기서는 간단한 데모만 수행합니다.
public class UserServiceImpl implements UserService { private Map<Long, User> userMap = new HashMap<Long, User>(); public UserServiceImpl() { User user = new User(); user.setUserId(10001L); user.setUsername("liyd1"); user.setEmail("liyd1@qq.com"); user.setGmtCreate(new Date()); userMap.put(user.getUserId(), user); user = new User(); user.setUserId(10002L); user.setUsername("liyd2"); user.setEmail("liyd2@qq.com"); user.setGmtCreate(new Date()); userMap.put(user.getUserId(), user); user = new User(); user.setUserId(10003L); user.setUsername("liyd3"); user.setEmail("liyd3@qq.com"); user.setGmtCreate(new Date()); userMap.put(user.getUserId(), user); } @Override public String getName(Long userId) { return "liyd-" + userId; } @Override public User getUser(Long userId) { return userMap.get(userId); } }
Publish service
인터페이스와 비즈니스 코드 작성이 완료되었습니다. 남은 것은 서비스를 게시하는 것뿐입니다. 즉, Spring 부팅과 cxf를 통합하는 것입니다. 사실 둘의 통합은 매우 간단하고, 이전 xml 방식보다 더 간결해졌습니다. 관련된 코드는 모두 다음과 같습니다.@Configuration public class CxfConfig { @Bean public ServletRegistrationBean dispatcherServlet() { return new ServletRegistrationBean(new CXFServlet(), "/soap/*"); } @Bean(name = Bus.DEFAULT_BUS_ID) public SpringBus springBus() { return new SpringBus(); } @Bean public UserService userService() { return new UserServiceImpl(); } @Bean public Endpoint endpoint() { EndpointImpl endpoint = new EndpointImpl(springBus(), userService()); endpoint.publish("/user"); return endpoint; } }cxf 구성을 보면 알 수 있습니다. 퍼블리싱 서비스에만 한두 줄의 코드만 있으면 됩니다. 놀라울 정도로 간단하죠? 이 시점에서 모든 작업이 완료되었습니다. Spring boot를 시작하고 localhost:8080/soap/user?wsdl을 방문하세요.관련 wsdl 설명 정보가 출력되는 것을 볼 수 있습니다. 출시되었습니다.
서비스 호출
웹 서비스가 출시되었습니다. 어떻게 호출하나요? 예를 들어 일부 타사 인터페이스를 통합할 때 먼저 호출한 다음 출시된? Soap 웹 서비스를 호출하는 일반적인 방법은 wsdl 기반으로 클라이언트 코드를 생성하는 것이며, 통합 후에는 로컬 인터페이스를 호출하는 것처럼 사용할 수 있습니다. 그런데 저는 개인적으로 이 방식을 별로 좋아하지 않습니다. 각 인터페이스를 한 번씩 생성해야 하고, 코드가 너무 많아서 번거롭습니다. 상쾌하고 간결한 메소드 이름을 호출하는 방식을 상대적으로 선호합니다. 다음은 모든 코드입니다.JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient("http://localhost:8080/soap/user?wsdl"); Object[] objects = client.invoke("getUser", 10002L); //输出调用结果 System.out.println(objects[0].getClass()); System.out.println(objects[0].toString());이 메소드에서 주의할 점은 호출된 서비스 인터페이스가 반환값이 사용자 정의 개체인 경우 결과 Object[]의
데이터 유형 이 이 사용자 정의 개체가 됩니다(구성 요소가 자동으로 이 개체를 생성함).
이지만 로컬에 없을 수도 있습니다. 그러한 클래스가 없으므로 직접 변환해야 합니다. 가장 간단한 방법은 반환된 결과와 정확히 동일한 새 클래스를 만들고 변환을 강제하는 것입니다. 물론 더 좋은 방법은 일반적인 클래스를 캡슐화하는 것입니다. 이는 이 글의 주제가 아니므로 여기서는 깊이 논의하지 않겠습니다. [관련 추천]1. 3.위 내용은 Java를 CXF와 통합하여 웹 서비스 개발을 완료하는 사례에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!