Создание компонента с использованием Spel hibernate

#hibernate #spring #file-upload #spring-mvc #spring-el

#переход в спящий режим #spring #загрузка файла #spring-mvc #spring-el

Вопрос:

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

Есть ли какой-либо способ добиться этого?

Ответ №1:

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

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

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

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

Ответ №2:

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