springboot整合Webservice
1、引入依赖
<!--webservice dependencies-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
</dependency>
<!--webservice dependencies-->
2、创建soap服务端
①、根据wsdl文件生成对应的实体
②、WebService配置类
@EnableWs @Configuration public class WebServiceConfig extends WsConfigurerAdapter { @Value("${webserivce.url}") private String webserviceUrl; @Bean public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) { MessageDispatcherServlet servlet = new MessageDispatcherServlet(); servlet.setApplicationContext(applicationContext); servlet.setTransformWsdlLocations(true); return new ServletRegistrationBean(servlet, "/ws/*"); } @Bean public WebServiceTemplate webServiceTemplate(){ WebServiceTemplate template = new WebServiceTemplateBuilder().build(); template.setDefaultUri(webserviceDefaultUri); template.setMarshaller(marshaller()); ClientInterceptor[] clientInterceptors = {new SoapClientInterceptor()}; template.setInterceptors(clientInterceptors); return template; } @Bean public Jaxb2Marshaller marshaller() { Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setContextPath(ObjectFactory.class.getPackage().getName()); return marshaller; } /** * wsdl 定义 * @return */ @Bean(name="xxx") public Wsdl11Definition xxxWsdl11Definition() { SimpleWsdl11Definition wsdl11Definition = new SimpleWsdl11Definition(); wsdl11Definition.setWsdl(new ClassPathResource("/wsdl/xxx.wsdl")); return wsdl11Definition; } }
③、编写Endpoint
SpringBoot的Endpoint主要是用来监控应用服务的运行状况,并集成在Mvc中提供查看接口。简单点说相当于一个url服务,就是将请求时的url与后台响应的方法对应起来。把它看做一个controller。
package com.ws.api.webservice;
import com.ws.api.sys.service.LoginService;
import com.ws.api.sys.service.ProduceReceiveService;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
import javax.annotation.Resource;
import java.util.List;
/**
* PDA接口切点
* @author
* @version badao
* @see
* @since
**/
@Endpoint
public class PdaEndpoint {
@Resource
private LoginService loginService;//引入用户mapper
private static final String NAMESPACE_URI = "http://test.com/webservice/pda";
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "PdaLoginRequest")
@ResponsePayload
public PdaLoginResponse statusFeedbacke(@RequestPayload PdaLoginRequest request){
String username = request.getUsername();
String password = request.getPassword();
return loginService.loginRequest(username,password);
}
}
注:
其中@Endpoint作用类似于@Controller。
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "PdaLoginRequest")声明命名空间,要与wsdl文件中的一致。
@ResponsePayload 必加,方法的返回类型要与wsdl定义的请求类型一致,方法参数里请求类型要与wsdl文件中的一致。我们可以通过request对象的get方法获取相应的请求参数。然后将service方法中的返回类型设置为相应的响应类型。
LoginService 代码:
package com.ws.api.sys.service;
import com.test.webservice.pda.PdaLoginResponse;
import org.springframework.stereotype.Service;
@Service
public interface LoginService {
PdaLoginResponse loginRequest(String username, String password);
}
serviceImpl代码:
package com.ws.api.sys.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wongoing.webservice.pda.LoginRequestResult;
import com.wongoing.webservice.pda.Menu;
import com.test.webservice.pda.MenuList;
import com.test.webservice.pda.PdaLoginResponse;
import com.ws.api.sys.entity.SysUser;
import com.ws.api.sys.mapper.SysUserMapper;
import com.ws.api.sys.service.LoginService;
import com.ws.api.sys.shiro.ShiroHelper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class LoginServiceImpl implements LoginService {
@Resource
private SysUserMapper sysUserMapper;//引入用户mapper
@Override
public PdaLoginResponse loginRequest(String username, String password) {
PdaLoginResponse response = new PdaLoginResponse();
LoginRequestResult result = new LoginRequestResult();
MenuList menuList = new MenuList();
List<Menu> menus = menuList.getMenu();
//MD5加密开始
//String salt = SequenceUtil.getInst().getRandomCode(6);
//开始查询数据库中有没有用户名
QueryWrapper<SysUser> sysUserQueryWrapper = new QueryWrapper<SysUser>();
sysUserQueryWrapper.eq("account", username);
sysUserQueryWrapper.eq("is_delete", "0");
SysUser sysUser = sysUserMapper.selectOne(sysUserQueryWrapper);
String encryptPassword="";
if (sysUser == null) {
result.setRequestResult(false);
result.setResultDesc("用户名不存在");
} else {
if(sysUser.getSalt()!=null){
String salt =sysUser.getSalt();
//加密后的密碼
encryptPassword = ShiroHelper.SHA1(password, username + salt);
//用户名存在时判断密码是否正确
sysUserQueryWrapper.eq("password", encryptPassword);
SysUser sysUser2 = sysUserMapper.selectOne(sysUserQueryWrapper);
if (sysUser2 == null) {
result.setRequestResult(false);
result.setResultDesc("密码不正确");
} else {
Menu menu = new Menu();
menu.setMenu("生产领料收货");
menu.setUrl("/ProduceReceiveRequest");
menus.add(menu);
Menu m = new Menu();
m.setMenu("质检领料收货");
m.setUrl("/QualityReceiveRequest");
menus.add(m);
Menu m2 = new Menu();
m2.setMenu("单件补码");
m2.setUrl("/SolidCodeRequest");
menus.add(m);
result.setRequestResult(true);
result.setResultDesc("登录成功");
}
}
}
response.setRequestResult(result);
response.setMenuResult(menuList);
return response;
}
}
其他业务流程要结合具体业务编写,注意响应的返回格式。
原文:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/89395156
3、创建soap客户端
①、demo
public class WsClient extendsWebServiceGatewaySupport {
publicGetCountryResponse getCountry(String name) {
GetCountryRequestrequest = new GetCountryRequest();
request.setName(name);
GetCountryResponseresponse = (GetCountryResponse) getWebServiceTemplate()
.marshalSendAndReceive(
"http://http://127.0.0.1:9111/ws/countries.wsdl",
request);
returnresponse;
}
}
②、客户端配置
@Configuration
public class WSConfig {
@Bean
publicJaxb2Marshaller marshaller() {
Jaxb2Marshallermarshaller = new Jaxb2Marshaller();
marshaller.setContextPath("com.wyait.ws.domain");
returnmarshaller;
}
@Bean
publicWsClient wsClient(Jaxb2Marshaller marshaller) {
WsClientclient = new WsClient();
client.setDefaultUri("http://127.0.0.1:9111/ws/countries.wsdl");
client.setMarshaller(marshaller);
client.setUnmarshaller(marshaller);
returnclient;
}
}
③、编写controller
@RestController
public class IndexController {
@Autowired
private WsClient wsClient;
@RequestMapping("callws")
public Object callWs() {
GetCountryResponse response =wsClient.getCountry("hello");
return response.getCountry();
}
}
原文:https://blog.51cto.com/wyait/1970033
测试项目是否可行:启动服务端项目,启动客户端项目,在客户端调用服务端方法,返回预期结果即可,注意服务端和客户端端口要区分。第一次用webservice确实有很多不习惯的地方,比如它那繁琐的schema文件。