[英]Disable Spring's implicit method dependency injection
我目前正在使用Struts开发应用程序,并且您好,直到我对其进行扩展以扩展ActionSupport
以获得对i18n功能的访问权限时,hello world页面都可以正常工作。 完成此操作后,操作始终开始返回input
作为结果字符串。 这显然是出乎意料的,因为目前还没有完成验证。 调试后,我注意到Spring决定注入一个字段错误映射,因此验证总是看到某些东西,从而导致意外的返回值。
] 1
这是堆栈跟踪:
Daemon Thread [http-0.0.0.0-8080-2] (Suspended (breakpoint at line 79 in ActionSupport))
Index(ActionSupport).setFieldErrors(Map<String,List<String>>) line: 79
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: not available
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: not available
Method.invoke(Object, Object...) line: not available
BeanWrapperImpl.setPropertyValue(BeanWrapperImpl$PropertyTokenHolder, PropertyValue) line: 1134
BeanWrapperImpl.setPropertyValue(PropertyValue) line: 903
BeanWrapperImpl(AbstractPropertyAccessor).setPropertyValues(PropertyValues, boolean, boolean) line: 75
BeanWrapperImpl(AbstractPropertyAccessor).setPropertyValues(PropertyValues) line: 57
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).applyPropertyValues(String, BeanDefinition, BeanWrapper, PropertyValues) line: 1450
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).populateBean(String, RootBeanDefinition, BeanWrapper) line: 1158
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).autowireBeanProperties(Object, int, boolean) line: 376
StrutsSpringObjectFactory(SpringObjectFactory).autoWireBean(Object, AutowireCapableBeanFactory) line: 218
StrutsSpringObjectFactory(SpringObjectFactory).buildBean(Class, Map<String,Object>) line: 198
StrutsSpringObjectFactory(SpringObjectFactory).buildBean(String, Map<String,Object>, boolean) line: 164
StrutsSpringObjectFactory(ObjectFactory).buildBean(String, Map<String,Object>) line: 178
DefaultActionFactory.buildAction(String, String, ActionConfig, Map<String,Object>) line: 22
StrutsSpringObjectFactory(ObjectFactory).buildAction(String, String, ActionConfig, Map<String,Object>) line: 148
DefaultActionInvocation.createAction(Map<String,Object>) line: 295
DefaultActionInvocation.init(ActionProxy) line: 395
StrutsActionProxy(DefaultActionProxy).prepare() line: 194
StrutsActionProxy.prepare() line: 63
StrutsActionProxyFactory.createActionProxy(ActionInvocation, String, String, String, boolean, boolean) line: 37
StrutsActionProxyFactory(DefaultActionProxyFactory).createActionProxy(String, String, String, Map<String,Object>, boolean, boolean) line: 58
Dispatcher.serviceAction(HttpServletRequest, HttpServletResponse, ActionMapping) line: 554
ExecuteOperations.executeAction(HttpServletRequest, HttpServletResponse, ActionMapping) line: 81
StrutsPrepareAndExecuteFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 99
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 235
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 206
OpenSessionInViewFilter.doFilterInternal(HttpServletRequest, HttpServletResponse, FilterChain) line: 232
OpenSessionInViewFilter(OncePerRequestFilter).doFilter(ServletRequest, ServletResponse, FilterChain) line: 106
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 235
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 206
ReplyHeaderFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 96
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 235
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 206
StandardWrapperValve.invoke(Request, Response) line: 230
StandardContextValve.invoke(Request, Response) line: 175
SecurityAssociationValve.invoke(Request, Response) line: 182
JaccContextValve.invoke(Request, Response) line: 84
StandardHostValve.invoke(Request, Response) line: 127
ErrorReportValve.invoke(Request, Response) line: 102
CachedConnectionValve.invoke(Request, Response) line: 157
StandardEngineValve.invoke(Request, Response) line: 109
CoyoteAdapter.service(Request, Response) line: 262
Http11Processor.process(Socket) line: 844
Http11Protocol$Http11ConnectionHandler.process(Socket) line: 583
JIoEndpoint$Worker.run() line: 446
Thread.run() line: not available
这基本上是该类包含的所有内容:
public class Index extends ActionSupport implements UserAware
{
private User user;
@Override
public String execute()
{
System.out.println("this doesn't print out");
return "SUCCESS";
}
@Override
public void setUser(User user)
{
this.user = user;
}
public User getUser()
{
return user;
}
}
我只使用@Autowired
注释的属性注入,所以我想禁用方法注入来解决此问题。 当然,如果那是问题所在。 我可能误解了症状。
默认情况下,Struts和Spring不能很好地配合使用,您需要在struts lib目录的WEB-INF / lib中添加struts2-spring-plugin-xyzjar。 并在web.xml中正确配置它,请参阅此http://www.tutorialspoint.com/struts_2/struts_spring.htm
发生这种情况是由于ActionSupport
实现了验证所需的所有接口,例如Validatable
和ValidationAware
。
ValidationAware
类可以接受Action
(类级别)或字段级别的错误消息。 动作级别消息保存在Collection
。 字段级错误消息保存在从String
字段名称到字段错误消息List
的Map
。
最后一个是针对注入错误的,但它不是Spring的工作(Spring使用其对象工厂来构建动作并注入其依赖项),它是Struts的工作,以支持带有字段错误和动作错误的动作,这很好通过validation
拦截器完成。
该拦截器通过标准验证框架运行该操作,该框架随后对照任何验证规则(在诸如
ActionClass-validation.xml
文件中找到)检查该操作,并添加字段级和操作级错误消息(前提是该操作实现了)com.opensymphony.xwork2.ValidationAware
)。
validation
拦截器包含在defaultStack
,默认情况下在任何操作中都会使用该拦截器。 如果操作不需要验证功能,则可以通过创建新堆栈或覆盖操作配置从堆栈中删除此拦截器。 如果将验证提供给其他方法,则可以从拦截器中排除某些方法或应用@SkipValidation
批注。 这将禁用操作方法的验证。
我可以通过在struts.xml
文件中将自动装配类型更改为none
来解决此问题。 我最初将其设置为type
因为我认为@Autowire
注入否则将无法工作。 我猜我错了,因为这些注射仍然有效。
<constant name="struts.objectFactory.spring.autoWire" value="type" />
至
<constant name="struts.objectFactory.spring.autoWire" value="none" />
感谢所有参与者的帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.