Создание бина с помощью Spel + hibernate

Мы используем Spring MVC + встроенная поддержка загрузки файлов. Я хочу установить максимальный размер загрузки, используя SpEL. Проблема в том, что это значение взято из нашей базы данных. Таким образом, в нашем старом коде приложения мы выполняем проверку после загрузки файла со следующим:

appManager.getAppConfiguration().getMaximumAllowedAttachmentSize();

Затем мы проверяем файл, чтобы узнать, больше ли он, чем это, и действуем в зависимости от размера.

Я хотел бы заменить этот код следующим вызовом в нашей конфигурации сервлета, например:

<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

Есть ли способ добиться этого?


person Scott    schedule 21.04.2011    source источник


Ответы (2)


Я бы попробовал другой подход:

  1. расширить org.springframework.web.multipart.commons.CommonsMultipartResolver
  2. добавьте org.springframework.beans.factory.InitializingBean или используйте @PostConstruct для написания метода, который будет вызывать appManager и устанавливать maxUploadSize на этапе инициализации bean-компонентов после того, как файл конфигурации был проанализирован и все зависимости были введены

Например вот так:

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;
    }
}
person Roadrunner    schedule 21.04.2011

Есть еще один вариант, который может быть полезен в зависимости от вашего случая. Вы можете расширить PropertiesFactoryBean или PropertyPlaceholderConfigurer и получить некоторые свойства из вашей базы данных.

person sinuhepop    schedule 22.04.2011