#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:
Я бы попробовал другой подход:
- расширить
org.springframework.web.multipart.commons.CommonsMultipartResolver
- добавьте
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
и получить некоторые свойства из своей базы данных.