2011-04-21 103 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並從數據庫中獲取一些屬性。