springboot整合Webservice

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文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值