[随写笔记] JavaWebService服务端通过反射调用子类处理业务
一、创建WebService入口类的子类,命名统一规范(名称+业务处理ID)
package com.web.service.impl;
public class WebService001Demo extends WebServiceDemoImpl {
@Override
public String hello(String code , String name) {
return "来自 " + code + " 的 hello word : " + name;
}
}
二、修改webService入口方法,修改为通过业务处理Id反射到其子类业务
package com.web.service.impl;
import com.web.service.WebServiceDemo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import javax.jws.WebService;
@Service
@WebService(
serviceName = "WebServiceDemo" , // 对外发布的服务名,与接口名一致
targetNamespace = "http://service.web.com" , // 名称空间,一般为包名反转
endpointInterface = "com.web.service.WebServiceDemo" // 接口地址,定做SEI(Service EndPoint Interface)服务端点接口
)
public class WebServiceDemoImpl implements WebServiceDemo {
@Override
public String hello(String code , String name) {
System.out.println("入参 code[" + code + "] name[" + name + "]");
// 使用 完整路径进行反射
String clazz = "com.web.service.impl.WebService"+code+"Demo";
String ret = "";
try {
Class<?> aClass = Class.forName(clazz);
WebServiceDemoImpl webServiceDemo = (WebServiceDemoImpl)aClass.newInstance();
ret = webServiceDemo.hello(code, name);
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException ignored) {
ret = "找不到对应的子类,调用了父类";
}
System.out.println(ret);
return ret;
}
}
客户端通过ID号进行调用
@Test
void contextLoads() {
String wsUrl = "http://127.0.0.1:8018/xygg/webservice?wsdl";
String method = "hello";
Object[] param = {"001","晓宇哥哥"};
Object[] invoke = CXFUtil.invoke(wsUrl, method, param);
System.out.println("ws返回:" + Arrays.toString(invoke));
}
结果返回,
ws返回:[来自 001 的 hello word : 晓宇哥哥]
调用子类成功
三、第二种方法,通过引用spring boot里的Bean
1、将子类注入Bean
package com.web.service.impl;
import org.springframework.stereotype.Service;
// 将子类注入Bean
@Service
public class WebService001Demo extends WebServiceDemoImpl {
2、修改spring boot配置类中装配的WebService接口,使用@Qualifier注解指定
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;
@Configuration
public class WebServiceConfig {
@Qualifier("webServiceDemoImpl")
@Autowired
private WebServiceDemo webServiceDemo;
3、在Webservice主接口方法,通过ApplicationContext获取Bean
package com.web.service.impl;
import com.web.service.WebServiceDemo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import javax.jws.WebService;
@Service
@WebService(
serviceName = "WebServiceDemo" , // 对外发布的服务名,与接口名一致
targetNamespace = "http://service.web.com" , // 名称空间,一般为包名反转
endpointInterface = "com.web.service.WebServiceDemo" // 接口地址,定做SEI(Service EndPoint Interface)服务端点接口
)
public class WebServiceDemoImpl implements WebServiceDemo {
@Autowired
private ApplicationContext applicationContext;
@Override
public String hello(String code , String name) {
// 使用spring boot里的Bean对象
String beanName = "webService" + code + "Demo";
WebServiceDemoImpl bean = null;
String ret = "";
try {
bean = (WebServiceDemoImpl)applicationContext.getBean(beanName);
ret = bean.hello(code, name);
}catch (Exception e) {
ret = "找不到对应的Bean,调用了父类";
}
System.out.println(ret);
return ret;
}
}
客户端调用:
ws返回:[来自 001 的 hello word : 晓宇哥哥]
同样成功
本文介绍了如何在Java WebService服务端利用反射根据业务处理Id调用对应的子类来处理业务,以及另一种方法,通过Spring Boot的Bean注入和@Qualifier注解来指定具体的实现。两种方式均实现了客户端的成功调用。

被折叠的 条评论
为什么被折叠?



