[随写笔记] JavaWebService服务端通过反射调用子类处理业务

本文介绍了如何在Java WebService服务端利用反射根据业务处理Id调用对应的子类来处理业务,以及另一种方法,通过Spring Boot的Bean注入和@Qualifier注解来指定具体的实现。两种方式均实现了客户端的成功调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[随写笔记] 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 : 晓宇哥哥]

同样成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值