Java 在Jax-Ws和Spring容器中使用@Autowire

Java 在Jax-Ws和Spring容器中使用@Autowire,java,spring,web-services,jax-ws,spring-ioc,Java,Spring,Web Services,Jax Ws,Spring Ioc,我有一个带有Spring容器的Jax Ws Metro项目。我无法在SoapHandler中自动关联字段。我尝试了互联网资源的一切,但没有成功。该字段始终为空。字段名为“paymentPortalService” 我的处理程序类: public class CustomSoapHeaderHandler extends SpringBeanAutowiringSupport implements SOAPHandler<SOAPMessageContext> { privat

我有一个带有Spring容器的Jax Ws Metro项目。我无法在SoapHandler中自动关联字段。我尝试了互联网资源的一切,但没有成功。该字段始终为空。字段名为“paymentPortalService”

我的处理程序类:

public class CustomSoapHeaderHandler extends SpringBeanAutowiringSupport implements SOAPHandler<SOAPMessageContext> {
    private static final Logger log = Logger.getLogger(CustomSoapHeaderHandler.class);

    @Autowire
    private PaymentPortalService paymentPortalService;
}
公共类CustomSoapHeaderHandler扩展SpringBeanAutowiringSupport实现SOAPHandler{
私有静态最终记录器log=Logger.getLogger(CustomSoapHeaderHandler.class);
@自动连线
私人付费门户服务付费门户服务;
}
我有一个代理服务,它调用远程服务。已将此处理程序添加到远程服务调用方法中的handlerchain:

@Service
public class CustomServiceProxy {
    private final Logger log = Logger.getLogger(CustomServiceProxy.class);
    private RemoteServicePort pspPort;


    public CustomServiceProxy() {
        try {


        pspPort = new RemoteService_Service(new URL("https://x?wsdl")).getRemoteServicePort();

        Binding binding = ((BindingProvider) pspPort).getBinding();
        List<Handler> handlers = binding.getHandlerChain();
        handlers.add(new CustomSoapHeaderHandler());
        binding.setHandlerChain(handlers);
    }
}
@服务
公共类CustomServiceProxy{
私有最终记录器log=Logger.getLogger(CustomServiceProxy.class);
专用远程服务端口;
公共CustomServiceProxy(){
试一试{
psport=new-RemoteService_-Service(新URL(“https://x?wsdl”)).getRemoteServicePort();
Binding Binding=((BindingProvider)psport.getBinding();
列表处理程序=binding.getHandlerChain();
add(新的CustomSoapHeaderHandler());
binding.setHandlerChain(处理器);
}
}
我试图将@Autowire更改为@Resource和其他一些internet解决方案,但没有成功。我使用的是不带EE容器的Apache Tomcat 8

提前感谢!

从ivy添加这个罐子
Add this jar from ivy

<dependency org="org.springframework" name="spring-aop" rev="4.2.1.RELEASE" transitive="false"/>
<dependency org="org.springframework" name="spring-beans" rev="4.2.1.RELEASE" transitive="false"/>
<dependency org="org.springframework" name="spring-context" rev="4.2.1.RELEASE" transitive="false"/>
<dependency org="org.springframework" name="spring-core" rev="4.2.1.RELEASE" transitive="false"/>
<dependency org="org.springframework" name="spring-expression" rev="4.1.1.RELEASE" transitive="false"/>
<dependency org="org.springframework" name="spring-web" rev="4.2.1.RELEASE" transitive="false"/>
<dependency org="org.springframework" name="spring-webmvc" rev="4.2.1.RELEASE" transitive="false"/>
<dependency org="org.springframework" name="spring-jdbc" rev="4.2.5.RELEASE" transitive="false"/>
<dependency org="org.springframework" name="spring-tx" rev="4.2.5.RELEASE" transitive="false"/>
<dependency org="com.fasterxml.jackson.core" name="jackson-annotations" rev="2.7.4" transitive="false"/>
<dependency org="com.fasterxml.jackson.core" name="jackson-core" rev="2.7.4" transitive="false"/>
<dependency org="com.fasterxml.jackson.core" name="jackson-databind" rev="2.7.4" transitive="false"/>
<dependency org="mysql" name="mysql-connector-java" rev="5.1.39" transitive="false"/>
<dependency org="org.apache.commons" name="commons-dbcp2" rev="2.1.1" transitive="false"/>
<dependency org="org.apache.commons" name="commons-pool2" rev="2.4.2" transitive="false"/>

A response object bean looks like

@Component
public class ResponseObjectBean {
    @JsonProperty("code")
    private int statusCode;
    @JsonProperty("msg")
    private String statusMsg;
    @JsonProperty("data")
    private Object data;

    //getter and setter 
}

A log in controller

@RestController
public class LogInController {

    @Autowired
    ResponseObjectBean responseData;

    @Autowired
    LogInService logInService;

    @RequestMapping(value = "/login", method = RequestMethod.POST)

    public ResponseEntity<ResponseObjectBean> userLogIn(@RequestBody UserInfoBean userInfoBean) {
        Object data = null;
        String msg = null;
        int statusCode;
        try {
            data = logInService.logIn(userInfoBean);

            if (data != null) {
                msg = "success";
                statusCode = 200;
            } else {
                msg = "fail";
                statusCode = 503;
            }
        } catch (DataAccessException e) {

                msg = "fail";
                statusCode = 503;
        } catch (Exception e) {

                msg = "fail";
                statusCode = 503;
            e.printStackTrace();
        }

        responseData.setStatusCode(statusCode);
        responseData.setStatusMsg(msg);
        responseData.setData(data);
        return new ResponseEntity<ResponseObjectBean>(responseData, HttpStatus.OK);

    }

}


A log in Service class looks like

@Service
@Transactional
public class LogInService {

    @Autowired
    LogInDao logInDao;

    public UserInfoBean logIn(UserInfoBean userInfoBean) throws DataAccessException {
        return logInDao.upSertUser(userInfoBean);

    }

}


A log in dao class
@Repository
public class LogInDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public UserInfoBean upSertUser(UserInfoBean userInfoBean) throws Exception {
        StringBuilder sql = new StringBuilder();
        int count;
        UserInfoBean infoBean = null;

        try {
            // your logic for db operation
                return infoBean;
            }
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
            sql = null;
            infoBean = null;
            run = null;
        }

    }

}

for use jdbc templete add these line in your spring.xml

    <!-- jdbcTemplate uses dataSource -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- dataSource configuration -->
    <bean id="dataSource" destroy-method="close"
        class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="your driverClassName" />
        <property name="url" value="your url" />
        <property name="username" value="db username" />
        <property name="password" value="db password" />
    </bean>
响应对象bean看起来像 @组成部分 公共类ResponseObjectBean{ @JsonProperty(“代码”) 专用int状态码; @JsonProperty(“msg”) 私有字符串statusMsg; @JsonProperty(“数据”) 私有对象数据; //接二连三 } 登录控制器 @RestController 公共类登录控制器{ @自动连线 ResponseObjectBean responseData; @自动连线 登录服务登录服务; @RequestMapping(value=“/login”,method=RequestMethod.POST) 公共响应性userLogIn(@RequestBody UserInfoBean UserInfoBean){ 对象数据=null; 字符串msg=null; int状态码; 试一试{ data=logInService.logIn(userInfoBean); 如果(数据!=null){ msg=“成功”; 状态代码=200; }否则{ msg=“失败”; statusCode=503; } }捕获(数据访问异常){ msg=“失败”; statusCode=503; }捕获(例外e){ msg=“失败”; statusCode=503; e、 printStackTrace(); } responseData.setStatusCode(状态代码); 响应数据setStatusMsg(msg); responseData.setData(数据); 返回新的ResponseEntity(responseData,HttpStatus.OK); } } 登录服务类看起来像 @服务 @交易的 公共类登录服务{ @自动连线 罗根多罗根多; 公共UserInfoBean登录(UserInfoBean UserInfoBean)引发DataAccessException{ 返回logInDao.upSertUser(userInfoBean); } } 登录dao类 @存储库 公共类登录{ @自动连线 私有JdbcTemplate JdbcTemplate; 公共UserInfoBean upSertUser(UserInfoBean UserInfoBean)引发异常{ StringBuilder sql=新的StringBuilder(); 整数计数; UserInfoBean-infoBean=null; 试一试{ //数据库操作的逻辑 返回infoBean; } }捕获(例外e){ 抛出新异常(e); }最后{ sql=null; infoBean=null; run=null; } } } 为了使用jdbc模板,请在spring.xml中添加以下行
为什么不应该为
null
。您正在自己创建
CustomSoapHeaderHandler
的实例。它不是由任何类型的容器管理的,无论是jersey还是Spring。所以不会注射任何东西。我建议您阅读jersey文档,该文档非常清楚地解释了如何使用Spring设置jersey。谢谢您的回复!是的,我知道这是一个愚蠢的错误,我把它改为:自动连线私人用户SOAPHeaderHandler用户SOAPHeaderHandler;但它仍然不起作用。处理程序对象为空。我还向CustomSoapHeaderHandler类添加了组件注释。接下来,您的
SoapHandler
需要是一个
@组件
,我假设您已经设置了组件扫描。(请删除extends
SpringBeanAutowiringSupport
,因为它没有添加任何内容。这不是一件运动衫,而是一个Metro项目。您能否提供一份文档,说明在Jax Ws(Metro)中使用Spring DI的客户端处理程序?组件扫描在同一个包中的其他类中运行良好。您只使用Jax WS构造一个客户端来调用web服务,我假设?其余的是Spring?如果是这样,那么使用java来手动配置,而不是手动配置。然而,您的主要问题只是您的处理程序不是Spring管理的bean,ju让它成为一个。