使用Spel + hibernate创建Bean

时间:2011-04-21 20:57:16

标签: hibernate spring file-upload spring-mvc spring-el

我们正在使用Spring MVC +内置支持上传文件。我想利用SpEL设置最大上传大小。问题是这个值来自我们的数据库。因此,在我们的旧应用程序代码中,一旦我们使用以下内容上传文件,我们会进行检查:

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 个答案:

答案 0 :(得分:2)

我会尝试不同的方法:

  1. 扩展org.springframework.web.multipart.commons.CommonsMultipartResolver
  2. 添加org.springframework.beans.factory.InitializingBean或使用@PostConstruct编写一个方法,在解析配置文件之后调用appManager并在bean初始化阶段设置maxUploadSize依赖注入
  3. 例如:

    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;
        }
    }
    

答案 1 :(得分:0)

根据您的情况,还有其他选项可能很有用。您可以扩展PropertiesFactoryBeanPropertyPlaceholderConfigurer并从数据库中获取一些属性。