Создание бина с использованием Spel + hibernate - PullRequest
0 голосов
/ 22 апреля 2011

Мы используем 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

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

Ответы [ 2 ]

2 голосов
/ 22 апреля 2011

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

  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;
    }
}
0 голосов
/ 23 апреля 2011

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

...