【问题标题】:UsernameTokenValidator Can not @Autowired DaoUsernameTokenValidator 不能@Autowired Dao
【发布时间】:2014-06-19 11:55:13
【问题描述】:

我有一个 Spring-ws,我正在使用 Apahce-wss4j 进行 spring-ws 身份验证。我想在我的自定义 TokenValidator 类中使用我的 Dao 类。但是有一个异常不能@Autowired 我的Dao 类。这是我的代码

applicationContext.xml

<bean id="myWssConfig" class="tr.com.xxx.services.MyWssConfig"/> <bean id="kepDBDAO" class="tr.com.xxx.dao.KepDBDAOImpl"/> <bean id="ssha" class="tr.com.xxx.utils.SSHA"/> <bean id="memberStatusService" class="tr.com.xxx.services.MemberStatusServiceImpl"/> <bean id="myUsernameTokenValidator" class="tr.com.xxx.services.MyUsernameTokenValidator"> <property name="kepDBDAO" ref="kepDBDAO"/> </bean>

<sws:interceptors>
    <bean class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor">
        <property name="validationActions" value="UsernameToken"/>
        <property name="validationCallbackHandler" ref="callbackHandler"/>
        <property name="wssConfig">
            <ref bean="myWssConfig"/>
        </property>
    </bean>
</sws:interceptors>

这里是 MyWssConfig.java

@Component("myWssConfig")
public class MyWssConfig extends WSSConfig {

    public MyWssConfig() {
        setValidator(WSSecurityEngine.USERNAME_TOKEN, MyUsernameTokenValidator.class);
        setRequiredPasswordType(WSConstants.PASSWORD_TEXT);
    }
}

这里是 MyUsernameTokenValidator.java

@Component
public class MyUsernameTokenValidator extends UsernameTokenValidator {


    private static final Logger LOGGER = LoggerFactory
            .getLogger(MyUsernameTokenValidator.class);

    @Autowired
    private KepDBDAO kepDBDAO;

    @Transactional
    protected void verifyPlaintextPassword(UsernameToken usernameToken, RequestData data) throws WSSecurityException {
        if (usernameToken != null && usernameToken.getPassword() != null) {   

            byte[] saltValue = null;
            kepDBDAO.getWsUsers("basvuru");
            String hashPassword = null;
            try {
                hashPassword = SSHA.calculateSSHA256(saltValue, usernameToken.getPassword());
            } catch (NoSuchAlgorithmException e) {
                LOGGER.error(e.toString(), e);
            } catch (IOException e) {
                LOGGER.error(e.toString(), e);
            }


            usernameToken.setPassword(hashPassword);


            super.verifyDigestPassword(usernameToken, data);
        }
    }

    public KepDBDAO getKepDBDAO() {
        return kepDBDAO;
    }

    public void setKepDBDAO(KepDBDAO kepDBDAO) {
        this.kepDBDAO = kepDBDAO;
    }
}

当我在 SOAPUI 中调用 web 服务时,无法 @Autowired 我的 KepDBDAO。

请帮帮我。谢谢大家。

【问题讨论】:

  • 我假设 KepDBDAO 是一个接口并且 KepDBDAOImpl 被标记为@Service。您可以发布任何异常跟踪吗?
  • 是的 KepDBDAO 是一个接口,我可以使用和测试我的 KepDBDAO 没有问题。没有例外:(我看到了调试模式...@NikhilTalreja
  • 你说'但是有一个异常不能@Autowired my Dao class'。这里的异常跟踪是什么。
  • 对不起。也不例外。我想说我的想法。这个问题不是运行时发生的。当我调用我的网络服务时,会出现此问题。这是 'schemas.xmlsoap.org/soap/envelope">
    SOAP-ENV:服务器java.lang.NullPointerException
    '
  • 如果没有堆栈跟踪,你怎么能确定 NullPointerException 是由于这个而不是其他原因

标签: spring web-services hibernate autowired spring-ws


【解决方案1】:
Try this:

1. In applicationContext:

<context:component-scan base-package="tr.com.xxx.dao"/> 
<context:component-scan base-package="package for MyUsernameTokenValidator"/>

remove these beans:

kepDBDAO, myUsernameTokenValidator

2. Remove setter and getter for KepDBDAO in MyUsernameTokenValidator 

3. Make sure KepDBDAOImpl is marked as @Service

【讨论】:

  • 我做了你的建议,但没有用 :( 我认为问题可能是 MyUsernameTokenValidator.java。因为我可以使用 KepDBDAO 其他模块
  • 如果MyUsernameTokenValidator是spring管理的,应该不会有问题
  • 这是一个 Spring @Component
  • 它还需要包含在包扫描中才能被视为 Spring bean
【解决方案2】:

我解决了我的问题。

@Component("myWssConfig")
public class MyWssConfig extends WSSConfig {

    @Autowired
    private MyUsernameTokenValidator myUsernameTokenValidator;

    //
    @PostConstruct
    public void myInit() {
        setValidator(WSSecurityEngine.USERNAME_TOKEN, myUsernameTokenValidator);
        setRequiredPasswordType(WSConstants.PASSWORD_TEXT);
    }
}

【讨论】:

  • 感谢您的意见@Nikhil ;)
  • org.apache.wss4j.dom.engine.WSSConfig 是最终类,不能扩展。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 2013-06-07
  • 1970-01-01
  • 2012-04-30
相关资源
最近更新 更多