#java #spring #dependency-injection
#java #весна #внедрение зависимостей
Вопрос:
У меня есть следующий XML-файл Spring для создания различных представлений для разных форматов файлов. У меня есть два свойства: URL-адрес и источник данных. Я хочу, чтобы URL-адрес был изменен во время выполнения, т.Е. Я хочу использовать разные jrxml
файлы, а не только один статический.
<bean id="pdfReport"
class="org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView"
p:url="classpath:tree-template.jrxml" p:reportDataKey="datasource" />
<bean id="xlsReport"
class="org.springframework.web.servlet.view.jasperreports.JasperReportsXlsView"
p:url="classpath:tree-template.jrxml" p:reportDataKey="datasource" />
<bean id="htmlReport"
class="org.springframework.web.servlet.view.jasperreports.JasperReportsHtmlView"
p:url="classpath:tree-template.jrxml" p:reportDataKey="datasource" />
<bean id="csvReport"
class="org.springframework.web.servlet.view.jasperreports.JasperReportsCsvView"
p:url="classpath:tree-template.jrxml" p:reportDataKey="datasource" />
Ответ №1:
Извлеките компонент из вашего контекста
ApplicationContext context = ...;
JasperReportsCsvView view = (JasperReportsCsvView) context.getBean("csvReport");
и используйте его установщик для изменения свойства
view.setUrl(someNewValue);
Сделайте то же самое для каждого компонента. Если ваши компоненты имеют общий супертип, вы можете использовать ApplicationContext#getBeansOfType(Class)
для извлечения их всех сразу как Map
. Затем вы перебираете записи и изменяете свойство представления.
Комментарии:
1. Большое спасибо за ваш ответ. Я использовал следующий код: JasperReportsPdfView view = (JasperReportsPdfView) ApplicationContext.getBean(«pdfReport»); view.setUrl(«D:\Jasper JRXML\Template.jrxml»); ModelAndView = new ModelAndView(view, parameterMap); Но представление, которое является компонентом spirng, не изменяется. Я использую шаблон MVC.
2. @BRS Ах, похоже, что эти представления отчетов Jasper загружают свой ресурс из URL-адреса при их создании и повторно используют в течение всего их жизненного цикла. Вам нужно будет создать новый компонент, чтобы использовать другой шаблон.
3. Итак, для каждого из отчетов я должен иметь отдельный класс и создавать компонент по мере необходимости, установив jrxml и datasource правильно? Тогда насколько здесь полезен DI?
4. @BRS Это почти правильно. Проблема в том, что этим
View
классам нужно нечто большее, чем просто источник данных и jrxml. Им нужен доступ кApplicationContext
. Я не думаю, что этиView
типы подходят для изменения шаблонов. Подумайте о том, чтобы изучить другой механизм создания шаблонов Jasper Reports.5. Спасибо, приятель. Я подумаю об использовании japser api и создании отдельных классов. Если вы знаете какие-либо ресурсы, пожалуйста, дайте мне знать.