0

当我尝试运行此脚本以保护 Grails / CXF 客户端上的 Web 服务时,我得到

SecureServiceFactory 上的“无法在 null 对象上调用方法 getInInterceptors()”

是否需要在其他地方设置secureServiceFactory ?

有任何想法吗:

代码 :

class BootStrap {

def secureServiceFactory

def init = { servletContext ->

    Map<String, Object> inProps = [:]
    inProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
    inProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
    Map<QName, Validator> validatorMap = new HashMap<QName, Validator>();
    validatorMap.put(WSSecurityEngine.USERNAME_TOKEN, new UsernameTokenValidator() {

        @Override
        protected void verifyPlaintextPassword(org.apache.ws.security.message.token.UsernameToken usernameToken, org.apache.ws.security.handler.RequestData data)
            throws org.apache.ws.security.WSSecurityException {
            if(data.username == "wsuser" && usernameToken.password == "secret") {
      println "username and password are correct!"
  } else {
      println "username and password are NOT correct..."
                throw new WSSecurityException("user and/or password mismatch")
            }
        }
    });
    inProps.put(WSS4JInInterceptor.VALIDATOR_MAP, validatorMap);
    secureServiceFactory.getInInterceptors().add(new WSS4JInInterceptor(inProps))
}
4

1 回答 1

0

不确定这是一个完整的答案,但是,我收到了相同的错误,并且我知道 cxf 插件旨在连接与您公开的服务名称匹配的服务工厂。我已经验证了开箱即用,使用grails run-app应用程序运行 grails-cxf 插件是有效的。但是,通过grails war在项目上执行会创建一个战争,当部署到 tc 服务器 [vfabric-tc-server-developer-2.9.4.RELEASE] tomcat 7 [tomcat-7.0.47.A.RELEASE] 时,会发生此错误。

注意到开箱即用也很有用,正如插件作者在其他参考文献中指出的那样 [ http://www.christianoestreich.com/2012/04/grails-cxf-interceptor-injection/]生成的战争赢了'除非您更改test('org.apache.ws.security:wss4j:1.6.7')为,否则compile('org.apache.ws.security:wss4j:1.6.7') 无法正常工作,并且我注意到我无法进行该工作,我不得不使用compile('org.apache.ws.security:wss4j:1.6.9')

不幸的是,在超过这个之后,我在部署没有发生的战争时遇到了第三个错误grails run-app

22-Aug-2014 11:46:05.062 SEVERE [tomcat-http--1] org.apache.catalina.core.StandardWrapperValve.invoke Allocate exception for servlet CxfServlet
 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'cxf' is defined
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:641)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1159)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:282)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:273)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:979)
    at org.apache.cxf.transport.servlet.CXFServlet.loadBus(CXFServlet.java:75)

我会继续看它,但也许这场战争并不是为了真正部署,而更多地只是为了开发插件本身。但是,如果是这样的话,在 TC 中工作仍然会更好,因为这样我们就可以放心地在自己的项目中利用代码。

于 2014-08-22T18:30:08.493 回答