[ 
https://issues.apache.org/jira/browse/WSS-230?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12865174#action_12865174
 ] 

Cheng Lee commented on WSS-230:
-------------------------------

Looking it a bit closer, it seems that the properties being set on the second 
call is the Spring Context Properties since it contains nearly all beans I 
think my sample application has. As I was using autowire by type, Spring is 
probably injecting whatever Properties it can find in the context.

I'm wondering if setProperties(Map<String, Object> properties) can be qualified 
using @Qualifier so that it would only inject a Map with a pre-defined ID but a 
name clash might occur if it's already in use. So calling setProperties() 
explicitly really seems to be the only solution. But I do think that the 
constructor "public WSS4JInInterceptor(Map<String, Object> properties)" is evil 
since in this use case, it will cause problems.

Could future versions of WSS4J log a warning stating that autowire by type + 
properties injection by constructor is a deadly combination (or better yet... 
deprecate it)? This really took me several days to figure out what was going on 
and I'm afraid many will go thru the same.

> WSS4JInInterceptor.getAction throws "No security action was defined" when 
> using Spring default-autowire="byType"
> ----------------------------------------------------------------------------------------------------------------
>
>                 Key: WSS-230
>                 URL: https://issues.apache.org/jira/browse/WSS-230
>             Project: WSS4J
>          Issue Type: Bug
>    Affects Versions: 1.5.8
>         Environment: spring 2.5.6, wss4j 1.5.8
>            Reporter: Cheng Lee
>            Assignee: Ruchith Udayanga Fernando
>         Attachments: webservice_sample_apache_cxf.tar.gz
>
>
> I'm getting "No security action was defined!":
> May 6, 2010 12:11:18 PM org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor 
> getAction
> WARNING: No security action was defined!
> May 6, 2010 12:11:18 PM org.apache.cxf.phase.PhaseInterceptorChain 
> doDefaultLoggingWARNING: Interceptor for 
> {http://service.auth.company.com/}corporateAuthService has thrown exception, 
> unwinding now
> org.apache.cxf.binding.soap.SoapFault: No security action was defined!
>       at 
> org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.getAction(WSS4JInInterceptor.java:421)
>       at 
> org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:189)
>       at 
> org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:78)
>       at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243)
>       at 
> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:110)
>       at 
> org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:98)
>       at 
> org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:423)
>       at 
> org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:178)
>       at 
> org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:142)
>       at 
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179)
>       at 
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:103)
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
>       at 
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>       at 
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
>       at 
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
>       at 
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
>       at 
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
>       at 
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
>       at 
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
>       at 
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
>       at 
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
>       at 
> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
>       at java.lang.Thread.run(Thread.java:619)
> When using Spring autowire by type, WSS4jInInterceptor.setProperties() is 
> called twice, thus overwriting my configuration below:
> <beans xmlns="http://www.springframework.org/schema/beans";
>   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
> xmlns:jaxws="http://cxf.apache.org/jaxws";
>   xsi:schemaLocation="http://www.springframework.org/schema/beans
>           http://www.springframework.org/schema/beans/spring-beans.xsd
>           http://cxf.apache.org/jaxws
>           http://cxf.apache.org/schemas/jaxws.xsd";
> default-autowire="byType">
>   <import resource="classpath:META-INF/cxf/cxf.xml" />
>   <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
>   <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
>   <jaxws:endpoint id="auth" implementor="#authServiceImpl"
>     address="/swAuth">
>     <jaxws:inInterceptors>
>       <bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />
>       <bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
>         <constructor-arg>
>           <map>
>             <entry key="action" value="UsernameToken" />
>             <entry key="passwordType" value="PasswordText" />
>             <entry key="passwordCallbackRef">
>               <ref bean="serverPasswordCallback" />
>             </entry>
>           </map>
>         </constructor-arg>
>       </bean>
>     </jaxws:inInterceptors>
>   </jaxws:endpoint>
>   <bean id="serverPasswordCallback" 
> class="com.company.auth.service.ServerPasswordCallback">
>     <property name="username">
>       <value>ws-client</value>
>     </property>
>     <property name="password">
>       <value>123</value>
>     </property>
>   </bean>
>   <bean id="authServiceImpl" class="com.company.auth.service.AuthServiceImpl">
>     <property name="employeeDao" ref="employeeDao" />
>   </bean>
> </beans>
> ----------
> This is evidenced while debugging:
> First time at WSS4JInInterceptor instantiation it calls setProperties() with 
> my values:
> Thread [main] (Suspended (breakpoint at line 112 in WSS4JInInterceptor))      
>       WSS4JInInterceptor.<init>(Map<String,Object>) line: 112 
>       NativeConstructorAccessorImpl.newInstance0(Constructor, Object[]) line: 
> not available [native method]   
>       NativeConstructorAccessorImpl.newInstance(Object[]) line: 39    
>       DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 27        
>       Constructor<T>.newInstance(Object...) line: 513 
>       BeanUtils.instantiateClass(Constructor, Object[]) line: 100     
>       
> CglibSubclassingInstantiationStrategy(SimpleInstantiationStrategy).instantiate(RootBeanDefinition,
>  String, BeanFactory, Constructor, Object[]) line: 87 
>       ConstructorResolver.autowireConstructor(String, RootBeanDefinition, 
> Constructor[], Object[]) line: 248  
>       
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).autowireConstructor(String,
>  RootBeanDefinition, Constructor[], Object[]) line: 925       
>       
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBeanInstance(String,
>  RootBeanDefinition, Object[]) line: 835       
>       
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String,
>  RootBeanDefinition, Object[]) line: 440     
>       AbstractAutowireCapableBeanFactory$1.run() line: 409    
>       AccessController.doPrivileged(PrivilegedAction<T>, 
> AccessControlContext) line: not available [native method]    
>       
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String,
>  RootBeanDefinition, Object[]) line: 380       
>       BeanDefinitionValueResolver.resolveInnerBean(Object, String, 
> BeanDefinition) line: 219  
>       BeanDefinitionValueResolver.resolveValueIfNecessary(Object, Object) 
> line: 117   
>       BeanDefinitionValueResolver.resolveManagedList(Object, List) line: 287  
>       BeanDefinitionValueResolver.resolveValueIfNecessary(Object, Object) 
> line: 126   
>       
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).applyPropertyValues(String,
>  BeanDefinition, BeanWrapper, PropertyValues) line: 1245      
>       
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).populateBean(String,
>  AbstractBeanDefinition, BeanWrapper) line: 1010     
>       
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String,
>  RootBeanDefinition, Object[]) line: 472     
>       AbstractAutowireCapableBeanFactory$1.run() line: 409    
>       AccessController.doPrivileged(PrivilegedAction<T>, 
> AccessControlContext) line: not available [native method]    
>       
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String,
>  RootBeanDefinition, Object[]) line: 380       
>       AbstractBeanFactory$1.getObject() line: 264     
>       
> DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, 
> ObjectFactory) line: 222  
>       DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, 
> Class, Object[], boolean) line: 261   
>       DefaultListableBeanFactory(AbstractBeanFactory).getBean(String, Class, 
> Object[]) line: 185      
>       DefaultListableBeanFactory(AbstractBeanFactory).getBean(String) line: 
> 164       
>       DefaultListableBeanFactory.preInstantiateSingletons() line: 429 
>       
> XmlWebApplicationContext(AbstractApplicationContext).finishBeanFactoryInitialization(ConfigurableListableBeanFactory)
>  line: 728 
>       XmlWebApplicationContext(AbstractApplicationContext).refresh() line: 
> 380        
>       ContextLoader.createWebApplicationContext(ServletContext, 
> ApplicationContext) line: 255 
>       ContextLoader.initWebApplicationContext(ServletContext) line: 199       
>       ContextLoaderListener.contextInitialized(ServletContextEvent) line: 45  
>       StandardContext.listenerStart() line: 3972      
>       StandardContext.start() line: 4467      
>       StandardHost(ContainerBase).start() line: 1045  
>       StandardHost.start() line: 722  
>       StandardEngine(ContainerBase).start() line: 1045        
>       StandardEngine.start() line: 443        
>       StandardService.start() line: 516       
>       StandardServer.start() line: 710        
>       Catalina.start() line: 593      
>       NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not 
> available [native method]  
>       NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39      
>       DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25  
>       Method.invoke(Object, Object...) line: 597      
>       Bootstrap.start() line: 289     
>       Bootstrap.main(String[]) line: 414      
> And then another invokation to setProperties(Map):
> Thread [main] (Suspended (breakpoint at line 130 in 
> AbstractWSS4JInterceptor))        
>       
> WSS4JInInterceptor(AbstractWSS4JInterceptor).setProperties(Map<String,Object>)
>  line: 130        
>       NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not 
> available [native method]  
>       NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39      
>       DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25  
>       Method.invoke(Object, Object...) line: 597      
>       BeanWrapperImpl.setPropertyValue(BeanWrapperImpl$PropertyTokenHolder, 
> PropertyValue) line: 840  
>       BeanWrapperImpl.setPropertyValue(PropertyValue) line: 651       
>       
> BeanWrapperImpl(AbstractPropertyAccessor).setPropertyValues(PropertyValues, 
> boolean, boolean) line: 78  
>       
> BeanWrapperImpl(AbstractPropertyAccessor).setPropertyValues(PropertyValues) 
> line: 59    
>       
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).applyPropertyValues(String,
>  BeanDefinition, BeanWrapper, PropertyValues) line: 1276      
>       
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).populateBean(String,
>  AbstractBeanDefinition, BeanWrapper) line: 1010     
>       
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String,
>  RootBeanDefinition, Object[]) line: 472     
>       AbstractAutowireCapableBeanFactory$1.run() line: 409    
>       AccessController.doPrivileged(PrivilegedAction<T>, 
> AccessControlContext) line: not available [native method]    
>       
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String,
>  RootBeanDefinition, Object[]) line: 380       
>       BeanDefinitionValueResolver.resolveInnerBean(Object, String, 
> BeanDefinition) line: 219  
>       BeanDefinitionValueResolver.resolveValueIfNecessary(Object, Object) 
> line: 117   
>       BeanDefinitionValueResolver.resolveManagedList(Object, List) line: 287  
>       BeanDefinitionValueResolver.resolveValueIfNecessary(Object, Object) 
> line: 126   
>       
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).applyPropertyValues(String,
>  BeanDefinition, BeanWrapper, PropertyValues) line: 1245      
>       
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).populateBean(String,
>  AbstractBeanDefinition, BeanWrapper) line: 1010     
>       
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String,
>  RootBeanDefinition, Object[]) line: 472     
>       AbstractAutowireCapableBeanFactory$1.run() line: 409    
>       AccessController.doPrivileged(PrivilegedAction<T>, 
> AccessControlContext) line: not available [native method]    
>       
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String,
>  RootBeanDefinition, Object[]) line: 380       
>       AbstractBeanFactory$1.getObject() line: 264     
>       
> DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, 
> ObjectFactory) line: 222  
>       DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, 
> Class, Object[], boolean) line: 261   
>       DefaultListableBeanFactory(AbstractBeanFactory).getBean(String, Class, 
> Object[]) line: 185      
>       DefaultListableBeanFactory(AbstractBeanFactory).getBean(String) line: 
> 164       
>       DefaultListableBeanFactory.preInstantiateSingletons() line: 429 
>       
> XmlWebApplicationContext(AbstractApplicationContext).finishBeanFactoryInitialization(ConfigurableListableBeanFactory)
>  line: 728 
>       XmlWebApplicationContext(AbstractApplicationContext).refresh() line: 
> 380        
>       ContextLoader.createWebApplicationContext(ServletContext, 
> ApplicationContext) line: 255 
>       ContextLoader.initWebApplicationContext(ServletContext) line: 199       
>       ContextLoaderListener.contextInitialized(ServletContextEvent) line: 45  
>       StandardContext.listenerStart() line: 3972      
>       StandardContext.start() line: 4467      
>       StandardHost(ContainerBase).start() line: 1045  
>       StandardHost.start() line: 722  
>       StandardEngine(ContainerBase).start() line: 1045        
>       StandardEngine.start() line: 443        
>       StandardService.start() line: 516       
>       StandardServer.start() line: 710        
>       Catalina.start() line: 593      
>       NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not 
> available [native method]  
>       NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39      
>       DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25  
>       Method.invoke(Object, Object...) line: 597      
>       Bootstrap.start() line: 289     
>       Bootstrap.main(String[]) line: 414      

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to