From ae324c98119ecc44041f40fcb5828773c4f72e33 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 6 Aug 2014 20:21:25 +0200 Subject: [PATCH] WW-4110 Adds special flag to use different logic when creating AOP beans --- .../java/org/apache/struts2/StrutsConstants.java | 3 +++ .../org/apache/struts2/default.properties | 5 +++++ .../struts2/spring/StrutsSpringObjectFactory.java | 3 +++ .../spring/StrutsSpringObjectFactoryTest.java | 4 ++-- .../xwork2/spring/SpringObjectFactory.java | 15 +++++++++++++++ 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/StrutsConstants.java b/core/src/main/java/org/apache/struts2/StrutsConstants.java index 7676f4ced..03287d663 100644 --- a/core/src/main/java/org/apache/struts2/StrutsConstants.java +++ b/core/src/main/java/org/apache/struts2/StrutsConstants.java @@ -155,6 +155,9 @@ public final class StrutsConstants { /** Whether Spring should use its class cache or not */ public static final String STRUTS_OBJECTFACTORY_SPRING_USE_CLASS_CACHE = "struts.objectFactory.spring.useClassCache"; + /** Uses different logic to construct beans, see https://issues.apache.org/jira/browse/WW-4110 */ + public static final String STRUTS_OBJECTFACTORY_SPRING_ENABLE_AOP_SUPPORT = "struts.objectFactory.spring.enableAopSupport"; + /** Whether or not XSLT templates should not be cached */ public static final String STRUTS_XSLT_NOCACHE = "struts.xslt.nocache"; diff --git a/core/src/main/resources/org/apache/struts2/default.properties b/core/src/main/resources/org/apache/struts2/default.properties index df3e1d4f4..561866630 100644 --- a/core/src/main/resources/org/apache/struts2/default.properties +++ b/core/src/main/resources/org/apache/struts2/default.properties @@ -47,6 +47,11 @@ struts.objectFactory.spring.useClassCache = true ### valid values are: true, false (false is the default) struts.objectFactory.spring.autoWire.alwaysRespect = false +### By default SpringObjectFactory doesn't support AOP +### This flag was added just temporally to check if nothing is broken +### See https://issues.apache.org/jira/browse/WW-4110 +struts.objectFactory.spring.enableAopSupport = false + ### if specified, the default object type determiner can be overridden here ### Note: short-hand notation is supported in some cases, such as "tiger" or "notiger" ### Alternatively, you can provide a com.opensymphony.xwork2.util.ObjectTypeDeterminer implementation name here diff --git a/plugins/spring/src/main/java/org/apache/struts2/spring/StrutsSpringObjectFactory.java b/plugins/spring/src/main/java/org/apache/struts2/spring/StrutsSpringObjectFactory.java index a5ad82dc3..d95830aa9 100644 --- a/plugins/spring/src/main/java/org/apache/struts2/spring/StrutsSpringObjectFactory.java +++ b/plugins/spring/src/main/java/org/apache/struts2/spring/StrutsSpringObjectFactory.java @@ -67,6 +67,7 @@ public class StrutsSpringObjectFactory extends SpringObjectFactory { @Inject(value=StrutsConstants.STRUTS_OBJECTFACTORY_SPRING_AUTOWIRE,required=false) String autoWire, @Inject(value=StrutsConstants.STRUTS_OBJECTFACTORY_SPRING_AUTOWIRE_ALWAYS_RESPECT,required=false) String alwaysAutoWire, @Inject(value=StrutsConstants.STRUTS_OBJECTFACTORY_SPRING_USE_CLASS_CACHE,required=false) String useClassCacheStr, + @Inject(value=StrutsConstants.STRUTS_OBJECTFACTORY_SPRING_ENABLE_AOP_SUPPORT,required=false) String enableAopSupport, @Inject ServletContext servletContext, @Inject(StrutsConstants.STRUTS_DEVMODE) String devMode, @Inject Container container) { @@ -141,6 +142,8 @@ public class StrutsSpringObjectFactory extends SpringObjectFactory { this.setAlwaysRespectAutowireStrategy("true".equalsIgnoreCase(alwaysAutoWire)); + this.setEnableAopSupport(enableAopSupport); + if (LOG.isInfoEnabled()) { LOG.info("... initialized Struts-Spring integration successfully"); } diff --git a/plugins/spring/src/test/java/org/apache/struts2/spring/StrutsSpringObjectFactoryTest.java b/plugins/spring/src/test/java/org/apache/struts2/spring/StrutsSpringObjectFactoryTest.java index 0bb7294de..92ce5a4ee 100644 --- a/plugins/spring/src/test/java/org/apache/struts2/spring/StrutsSpringObjectFactoryTest.java +++ b/plugins/spring/src/test/java/org/apache/struts2/spring/StrutsSpringObjectFactoryTest.java @@ -45,7 +45,7 @@ public class StrutsSpringObjectFactoryTest extends TestCase { Container container = EasyMock.createNiceMock(Container.class); EasyMock.replay(container); - StrutsSpringObjectFactory fac = new StrutsSpringObjectFactory(null, null, null, new MockServletContext(), null, container); + StrutsSpringObjectFactory fac = new StrutsSpringObjectFactory(null, null, null, null, new MockServletContext(), null, container); assertEquals(AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, fac.getAutowireStrategy()); } @@ -60,7 +60,7 @@ public class StrutsSpringObjectFactoryTest extends TestCase { ac.setServletContext(msc); ac.setConfigLocations(new String[] {"org/apache/struts2/spring/StrutsSpringObjectFactoryTest-applicationContext.xml"}); ac.refresh(); - StrutsSpringObjectFactory fac = new StrutsSpringObjectFactory("constructor", null, null, msc, null, container); + StrutsSpringObjectFactory fac = new StrutsSpringObjectFactory("constructor", null, null, null, msc, null, container); assertEquals(AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, fac.getAutowireStrategy()); } diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/spring/SpringObjectFactory.java b/xwork-core/src/main/java/com/opensymphony/xwork2/spring/SpringObjectFactory.java index 9ba065dda..56f6b539e 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/spring/SpringObjectFactory.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/spring/SpringObjectFactory.java @@ -47,6 +47,11 @@ public class SpringObjectFactory extends ObjectFactory implements ApplicationCon private final Map classes = new HashMap(); private boolean useClassCache = true; private boolean alwaysRespectAutowireStrategy = false; + /** + * This is temporary solution, after validating can be removed + * @since 2.3.18 + */ + private boolean enableAopSupport = false; @Inject(value="applicationContextPath",required=false) public void setApplicationContextPath(String ctx) { @@ -55,6 +60,11 @@ public class SpringObjectFactory extends ObjectFactory implements ApplicationCon } } + @Inject(value = "enableAopSupport", required = false) + public void setEnableAopSupport(String enableAopSupport) { + this.enableAopSupport = Boolean.parseBoolean(enableAopSupport); + } + /** * Set the Spring ApplicationContext that should be used to look beans up with. * @@ -175,6 +185,11 @@ public class SpringObjectFactory extends ObjectFactory implements ApplicationCon bean = autoWiringFactory.createBean(clazz, autowireStrategy, false); injectApplicationContext(bean); return injectInternalBeans(bean); + } else if (enableAopSupport) { + bean = autoWiringFactory.createBean(clazz, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, false); + bean = autoWireBean(bean, autoWiringFactory); + bean = autoWiringFactory.initializeBean(bean, bean.getClass().getName()); + return bean; } else { bean = autoWiringFactory.autowire(clazz, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, false); bean = autoWiringFactory.applyBeanPostProcessorsBeforeInitialization(bean, bean.getClass().getName());