Add the following artifacts into your Spring Boot pom.xml:
org.apache.cxf cxf-rt-frontend-jaxws 3.1.6 org.apache.cxf cxf-rt-transports-http 3.1.6
We start off by creating the request and response classes. These classes act as the value objects for the operation.
Request class:
package com.techtots.contracts; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class UserRegisterRequest { @XmlElement(required = true, nillable = false) private String username; @XmlElement(required = true, nillable = false) private String password; @XmlElement(required = true, nillable = false) private String email; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
Response class:
package com.techtots.contracts; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class UserRegisterResponse { @XmlElement(required = true, nillable = false) private String status; @XmlElement(required = true, nillable = false) private String message; public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
Now over to the service interface. We have an interface with one operation:
package com.techtots.services; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.xml.bind.annotation.XmlElement; import com.techtots.contracts.UserRegisterRequest; import com.techtots.contracts.UserRegisterResponse; @WebService public interface UserService { @WebMethod @WebResult(name = "userRegisterResponse") public @XmlElement(required = true, nillable = false) UserRegisterResponse registerUser( @XmlElement(required = true, nillable = false) @WebParam(name = "userRegisterRequest") UserRegisterRequest userRegisterRequest); }
@XmlElement(required = true, nillable = false) is defined to ensure the request and response object is tagged as required. By default, these are defined as minOccurs=0.
Implementation of this interface below. Nothing fancy. Just ensures that it gets called and returns the proper object:
package com.techtots.services; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.techtots.contracts.UserRegisterRequest; import com.techtots.contracts.UserRegisterResponse; public class UserServiceImpl implements UserService { private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class); @Override public UserRegisterResponse registerUser(UserRegisterRequest userRegisterRequest) { log.info(userRegisterRequest.getEmail()); UserRegisterResponse userRegisterResponse = new UserRegisterResponse(); userRegisterResponse.setMessage("CREATION SUCCESSFUL"); userRegisterResponse.setStatus("SUCCESS"); return userRegisterResponse; } }
Since we have all the classes defined, we'll need to hook this up into Spring Boot app. We do this by creating a config class:
package com.techtots; import javax.xml.ws.Endpoint; import org.apache.cxf.Bus; import org.apache.cxf.bus.spring.SpringBus; import org.apache.cxf.jaxws.EndpointImpl; import org.apache.cxf.transport.servlet.CXFServlet; import org.springframework.boot.context.embedded.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.techtots.services.UserServiceImpl; @Configuration public class WebServiceConfig { @Bean public ServletRegistrationBean dispatcherSerlvet() { return new ServletRegistrationBean(new CXFServlet(), "/services/*"); } @Bean(name = Bus.DEFAULT_BUS_ID) public SpringBus springBus() { return new SpringBus(); } @Bean public Endpoint userServiceEndpoint() { Endpoint ep = new EndpointImpl(springBus(), new UserServiceImpl()); ep.publish("/UserService"); return ep; } }
If you have more than one service end point, create a new function which returns the new endpoint and it will be picked up.
Start up the app and you should be able to view the WSDL via http://localhost:8080/services/UserService?wsdl.
If you would like to list down all services exposed, you can access http://localhost:8080/services. This feature is built into CXF.
1 comment:
Nice example!
Post a Comment