Two words of nagging
True, soap is harder to use than the now-popular restful webservice. Redundant XML text information too much, poor readability, its request information is sometimes difficult to manually construct, not very good debugging. But to be honest, the use of soap is still high for some business users.
Requirements background
A project that takes over maintenance, a recent customer wants to open a feature in the project to a third-party invocation, and the provider specifies that the SOAP interface must be the. The original code of the project I looked at the headache, also do not want to change, unless the rewrite. The customer's needs are not difficult but urgent, in order to quickly deliver on the use of Springboot fast to take a micro-service.
Get started.
1 . Create a new spring Starter Project 2 . Join CXF's maven configuration <dependency> <groupId>org.apache.cxf</groupId> <artifactId> Cxf-spring-boot-starter-jaxws</artifactid> <version>3.1. </version> </dependency>
Writing Service Code (sample code)
@WebService (name = "UserService", targetnamespace= "http://demo.example.com/") Public Interface iuserservice { @WebMethod int ID); int addUser (@WebParam (name = "User"), user user);
@InInterceptors (interceptors={"Com.example.demo.auth.AuthInterceptor"}) @WebService (ServiceName= "UserService", targetnamespace = "http://demo.example.com/", Endpointinterface = " Com.example.demo.soap.IUserService ") @Component Public classUserserviceimplImplementsIuserservice {PrivateLogger Logger = Loggerfactory.getlogger (Userserviceimpl.class); @AutowiredPrivateIuserdao Userdao; @Override PublicUser Getuserbyid (intID) {returnUserdao.getuserbyid (ID); } @Override Public intaddUser (user user) {logger.info ("Save User [" + user.getid () + "]"); Userdao.adduser (user); return0; }}
Authentication Interceptor
@Component Public classAuthinterceptorextendsAbstractsoapinterceptor {Private Static FinalString basic_prefix = "BASIC"; Private Static FinalString USERNAME = "Lichmama"; Private Static FinalString PASSWORD = "123456"; PublicAuthinterceptor () {Super(Phase.pre_invoke); } @Override Public voidHandlemessage (SoapMessage message)throwsFault {httpservletrequest request=(HttpServletRequest) message.get (abstracthttpdestination.http_request); String Auth= Request.getheader ("Authorization"); if(Auth = =NULL) { Throw NewIllegalArgumentException ("Auth failed, header [Authorization] NOT EXISTS"); } if(!Auth.startswith (Basic_prefix)) { Throw NewIllegalArgumentException ("Auth failed, header [Authorization] is illegal"); } String PlainText=NewString (Base64.getdecoder (). Decode (Auth.substring (Basic_prefix.length ()))); if(Stringutils.isempty (plaintext) | |!plaintext.contains (":")) { Throw NewIllegalArgumentException ("Auth failed, header [Authorization] is illegal"); } string[] Userandpass= Plaintext.split (":"); String username= Userandpass[0]; String Password= Userandpass[1]; if(! Username.equals (USERNAME) | | !password.equals (PASSWORD)) { Throw NewIllegalArgumentException ("Auth failed, username or password is incorrect"); } }}
Writing configuration Classes
@Configuration Public class soapconfig { @Autowired private iuserservice userservice; @Autowired @Qualifier (bus.default_bus_id) private springbus Bus; @Bean public Endpoint Endpoint () { new Endpointimpl (bus, UserService); Endpoint.publish ("/userservice"); return endpoint;} }
Modify CXF Default publishing path (application.properties)
server.port=8000Cxf.path=/soap
Access HTTP://LOCALHOST:8000/SOAP/USERSERVICE?WSDL after starting project
Test it with SOAPUI, it looks fine.
Finally, explain the development environment
STS 3.7.3 + springboot 2.0.1 + JDK1.8
Work is over.
Springboot + CXF Fast implementation of SOAP WebService (supports basic Auth)