Как изменить следующие свойства компонента во время выполнения?

#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 и создании отдельных классов. Если вы знаете какие-либо ресурсы, пожалуйста, дайте мне знать.