繁体   English   中英

禁用Spring的隐式方法依赖注入

[英]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注释的属性注入,所以我想禁用方法注入来解决此问题。 当然,如果那是问题所在。 我可能误解了症状。

版本号

  • 春季3.2.9
  • 支撑杆2.3.24

默认情况下,Struts和Spring不能很好地配合使用,您需要在struts lib目录的WEB-INF / lib中添加struts2-spring-plugin-xyzjar。 并在web.xml中正确配置它,请参阅此http://www.tutorialspoint.com/struts_2/struts_spring.htm

发生这种情况是由于ActionSupport实现了验证所需的所有接口,例如ValidatableValidationAware

ValidationAware类可以接受Action (类级别)或字段级别的错误消息。 动作级别消息保存在Collection 字段级错误消息保存在从String字段名称到字段错误消息ListMap

最后一个是针对注入错误的,但它不是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM