[
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]