2013-08-25 54 views
0

當我嘗試運行此腳本,以確保Grails的/ CXF客戶端上我的Web服務,我得到的Grails + CXF + secureServiceFactory

上secureServiceFactory

「不能調用方法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)) 
} 
+1

您可能希望包含您的resources.groovy或說明您認爲插件是否讓您注入secureServiceFactory。 – billjamesdev

+0

我只是跟着這個例子: http://www.christianoestreich.com/2012/04/grails-cxf-interceptor-injection/ 所以我的resources.groovy仍然是空的。 – user2672286

+1

再次閱讀文章。 cxf插件將服務工廠連接起來,這些服務工廠將**名爲'secureService'的暴露服務的名稱與名爲'secureServiceFactory'的bean匹配**。你有一個名爲'secureService'的服務嗎? – dmahapatro

回答

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工作仍然會更好,因爲那樣我們就可以放心地在自己的項目中利用代碼。