WebService接口学习(一):如何从别的系统获取数据来更新本系统的数据库

WebService接口学习(一):如何从别的系统获取数据来更新本系统的数据库首先我们要知道别的系统是怎么获取数据 一般在对应模块的业务层可以找到对应的方法 例如 我想获取用户的信息 但我没找到 因为别的系统没有要显示所有用户的方法 但我还想 可以从 DAO 层来直接从数据库调用 这种更简单暴力 我通过网页的调试 来找到 DAO 层调用的套路

大家好,我是讯享网,很高兴认识大家。

首先我们要知道别的系统是怎么获取数据,一般在对应模块的业务层可以找到对应的方法。例如:我想获取用户的信息,但我没找到,因为别的系统没有要显示所有用户的方法,但我还想,可以从DAO层来直接从数据库调用,这种更简单暴力,我通过网页的调试,来找到DAO层调用的套路,于是找到下面的DAO层:
在这里插入图片描述
讯享网
一开始我看到这里我也懵逼了,这是什么来的(因为我之前用的mybaitcs),我看了其他地方,发现是hibernate框架,上网找了下自定义sql语句来获取自己想要的方法,如上图的@Query的方法就是我添加上去的。

 @Query("select address,name,idCard,sex,nationality,birthday,cardId,telphone from PatientEntity") List<PatientEntity> getAllBy(); 

讯享网

最好不要取getAllBy()这种名字,这是JpaRepository对应的方法名,而这个dao层类是继承于JpaRepository,有可能和该系统的其他方法冲突导致其他功能用不了(之前踩雷,导致又重新下载该原生系统,重新导入方法也没用,后来发现就是方法名冲突了

然后就可以写接口了

在webservice接口添加

讯享网@WebMethod String queryPatient(); 

并在实现类中写对应的方法

@Override public String queryPatient() { return iRegisterService.queryPatient(); } 

iRegisterService是某个业务层接口的对象,这里注意要自己手动注入,否则NULL,调用不了业务层方法。因为webservice启动不会找springboot下的bean对象,所以只能自己注入,方法如下:

讯享网//通过工具类手动注入,不然为空,调用不了service层方法 IRegisterService iRegisterService=(IRegisterService) SpringContextUtils.getBean(IRegisterService.class); 

SpringContextUtils工具类代码如下:

package com.xgs.hisystem.util; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; / * Spring容器工具类 * @author lv * */ @Component("springContextUtils") public class SpringContextUtils implements ApplicationContextAware { / * Spring应用上下文环境 */ private static ApplicationContext applicationContext; / * 实现ApplicationContextAware接口的回调方法,设置上下文环境 * * @param applicationContext */ public void setApplicationContext(ApplicationContext applicationContext) { SpringContextUtils.applicationContext = applicationContext; } / * @return ApplicationContext */ public static ApplicationContext getApplicationContext() { return applicationContext; } / * 获取对象 * * @param name * @return Object * @throws BeansException */ public static Object getBean(String name) throws BeansException { return applicationContext.getBean(name); } / * 根据class获取对应的bean对象 * @param clz * @return */ public static Object getBean(Class<?> clz){ return applicationContext.getBean(clz); } } 

然后就可以在业务层实现类写取数据方法了

讯享网@Override public String queryPatient() { try{ List<PatientEntity> patientEntityList=iPatientRepository.getAllBy(); return JSONUtil.listToJson(patientEntityList); }catch (Exception e){ e.printStackTrace(); } return null; } 

这样第三方接口就写好,接下来讲下如何调用

public class WebServiceUtil { // 日志 private static Logger log = LoggerFactory.getLogger(WebServiceUtil.class); // WebService 查询地址,第三方接口地址 private static final String WEB_SERVICE_ADDRESS = "http://localhost:8091/webService/?wsdl"; / * * 获取 Web Service 客户端 * * @return Web Service 客户端 * */ public static Client getClient() { // 动态客户端工厂类 JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); // 根据 wsdl 生成 Web Service 客户端 Client client = dcf.createClient(WEB_SERVICE_ADDRESS); return client; } public static JSONArray query(String method){ JSONArray json=new JSONArray(); try { // 获取 Web Service 客户端 Client c = getClient(); // 调用接口,method为方法名 Object[] os = c.invoke(method); //把从第三方系统传来的数据转换成JSONArray json= JSONArray.fromObject(os[0]); System.out.println(json); log.info("查询信息成功"); return json; } catch (Exception e) { log.error("查询 '"+method+"' 信息成功出现异常"); log.error("异常信息如下: ", e); } return json; } } 

然后我就可以在本系统的Controller层写调用接口方法,并把数据保存数据库

讯享网@ResponseBody @RequestMapping("/doUpdateHisystem") public Object doUpdateHisystem(Patient patient){ AjaxResult result=new AjaxResult(); int count=0; try{ //调用webservice接口,获取第三方his的医生信息的JSONArray JSONArray jsonArray= WebServiceUtil.query("queryPatient"); patientService.deleteAll(); for(int i=0;i<jsonArray.size();i++){ patient.setAddress(jsonArray.getJSONArray(i).get(0).toString()); patient.setUsername(jsonArray.getJSONArray(i).get(1).toString()); patient.setIdcard(jsonArray.getJSONArray(i).get(2).toString()); patient.setSex(jsonArray.getJSONArray(i).get(3).toString()); patient.setNation(jsonArray.getJSONArray(i).get(4).toString()); patient.setBirthday(jsonArray.getJSONArray(i).get(5).toString()); patient.setCardid(jsonArray.getJSONArray(i).get(6).toString()); patient.setCellphone(jsonArray.getJSONArray(i).get(7).toString()); //通过上面set方法把数据传到patient实体类对象,然后扔到业务层,再通过DAO层来保存数据库 count+=patientService.savePatient(patient); } result.setSuccess(count==jsonArray.size()); }catch (Exception e){ result.setSuccess(false); e.printStackTrace(); result.setMessage("更新患者信息失败!"); } return result; } 
小讯
上一篇 2025-01-24 22:05
下一篇 2025-03-30 13:48

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/42998.html