2011-04-21 56 views
0

我们使用Spring MVC +的内置支持上传文件。我想使用SpEL设置最大上传大小。问题是这个值来自我们的数据库。因此,在我们旧的应用程序代码中,我们做了一次检查,我们有以下上传的文件:使用Spel + hibernate创建Bean

appManager.getAppConfiguration().getMaximumAllowedAttachmentSize(); 

然后我们检查文件,看它是否大于该值,并根据尺寸进行。

我想,在我们的servlet配置以下调用像这样来替换代码:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver> 
    <property name="maxUploadSize" value="#{appManager.getAppConfiguration().getMaximumAllowedAttachmentSize()}" /> 
</bean> 

的问题是,在初始化时我收到以下异常:

Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.hibernate.LazyInitializationException: could not initialize proxy - no Session 

是有什么办法可以做到这一点?

回答

2

我想尝试一个不同的充方式:

  1. 延长org.springframework.web.multipart.commons.CommonsMultipartResolver
  2. 添加org.springframework.beans.factory.InitializingBean或使用@PostConstruct编写将调用appManager的方法,并设置在豆类maxUploadSize初始化阶段,配置完成后文件被解析并且所有依赖项被注入

例如这样:

public class MyMultipartResolver extends CommonsMultipartResolver { 

    @Autowired 
    private AppManager appManager; 

    @PostConstruct 
    public void init() { 
     setMaxUploadSize(
      appManager.getAppConfiguration().getMaximumAllowedAttachmentSize()); 
    } 
} 

在应用程序上下文初始化过程中,最大上传大小仍将在多部分解析器上设置一次。如果数据库中的值发生更改,则需要重新启动应用程序才能为新值重新配置解析器。

考虑,如果你不需要重写CommonsFileUploadSupport#prepareFileUpload()这样,而不是:

public class MyMultipartResolver extends CommonsMultipartResolver { 

    @Autowired 
    private AppManager appManager; 

    @Override 
    protected FileUpload prepareFileUpload(String encoding) { 
     FileUpload fileUpload = super.prepareFileUpload(encoding); 
     fileUpload.setSizeMax(
      appManager.getAppConfiguration().getMaximumAllowedAttachmentSize()); 
     return fileUpload; 
    } 
} 
0

还有就是可以根据你的情况是有用的另一种选择。您可以扩展PropertiesFactoryBeanPropertyPlaceholderConfigurer并从数据库中获取一些属性。

相关问题