从Spring升级至Spring Boot导致JAX-WS客户端Bean无法注入问题
Spring Boot迁移中JAX-WS客户端Bean注入失败的解决方案
嘿,我刚好碰到过类似的Spring Boot迁移问题,你的情况应该是Spring Boot默认不识别原来Spring XML里的jaxws命名空间配置,导致那个applyClient Bean没被正确创建,所以Controller自动注入时提示找不到类型。下面给你几个可行的解决方案:
方案一:改用Java配置类创建JAX-WS客户端Bean(推荐)
Spring Boot更推崇Java Config的方式,替代原来的XML配置,这样更贴合Boot的自动配置体系:
1. 先补全JAX-WS依赖
如果是Maven项目,在pom.xml中添加以下依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> </dependency> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>2.3.5</version> <!-- 选择和你原有版本兼容的版本 --> </dependency>
2. 编写配置类生成客户端Bean
创建一个配置类,对应原来XML里的<jaxws:client>配置,包括拦截器:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.sun.xml.ws.developer.WSBindingProvider; import javax.xml.namespace.QName; import javax.xml.ws.Service; import java.net.URL; @Configuration public class JaxWsClientConfig { @Bean public JaxClass applyClient() throws Exception { // 替换为你的实际WSDL地址(可以直接用原来的address加上?wsdl) URL wsdlUrl = new URL("jaxAddress?wsdl"); // 替换为你的JAX-WS服务对应的QName(命名空间+服务名称) QName serviceQName = new QName("http://your-namespace.com/", "YourServiceName"); Service service = Service.create(wsdlUrl, serviceQName); JaxClass clientProxy = service.getPort(JaxClass.class); // 添加输出拦截器,对应原来的<jaxws:outInterceptors>配置 WSBindingProvider bindingProvider = (WSBindingProvider) clientProxy; bindingProvider.getOutInterceptors().add(new YourOutInterceptor()); // 替换为你原来的拦截器实例 return clientProxy; } }
3. 控制器中正常注入
推荐使用构造器注入(符合Spring Boot最佳实践):
@RestController public class YourController { private final JaxClass applyClient; // 构造器注入,无需@Autowired(Spring 4.3+自动支持) public YourController(JaxClass applyClient) { this.applyClient = applyClient; } // 业务方法中直接使用applyClient即可 }
方案二:保留原有XML配置,让Spring Boot加载它
如果你不想改动原有XML配置,可以在Spring Boot启动类上添加@ImportResource注解,指定加载你的JAX-WS配置XML:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ImportResource; @SpringBootApplication @ImportResource("classpath:your-jaxws-config.xml") // 替换为你的XML配置文件路径 public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
注意:这种方式同样需要补全方案一中的JAX-WS依赖,否则Spring Boot无法解析jaxws命名空间的标签。
关键原因总结
Spring Boot的自动配置体系默认不会加载传统Spring的jaxws命名空间配置,也不会自动引入JAX-WS的相关依赖,所以要么用Java Config重新定义Bean,要么手动导入XML并补全依赖,就能解决注入失败的问题。
内容的提问来源于stack exchange,提问作者Daniel Hawes
相关产品推荐
相关产品推荐

