поиск компонентов из resources.xml в контроллер / сервис в groovy

#spring #grails #groovy

#spring #grails #groovy

Вопрос:

Я использую groovy-grails с отчетами jasper для разработки приложения. Мне нужно выполнить поиск «компонента отчета» на основе его параметра (например, reportname / id, извлеченного из базы данных, который я получу по щелчку клиента), который будет сохранен как свойство компонента отчета из resources.xml либо в reportcontroller, либо в reportservice. Также мне нужно «получить» шаблон jrxml, связанный с этим идентификатором, и сопоставление параметров, оба из которых определены как свойства в компоненте. Мне нужно знать, как мы можем этого добиться, и нужно ли нам определять какие-либо «управляющие компоненты» в xml, которые управляют этими компонентами отчета. Так, например, компонент отчета будет выглядеть следующим образом:

      <bean id="DeptReport" class="com.myapp.reporting.domain.Report">    
        <property name="reportName" value="Dept Report"/>
        <property name="reportFiles">
          <map>
            <entry key="JasperPrint" value="DeptRoles.jrxml"/>
          </map>
        </property>
        <property name="promptforparameter" value="true"/>
        <property name="parameter" value="department_id"/>
        <property name="displayName" value="report.deptReport.name"/>
     </bean>
  

Таких компонентов будет много.

Кроме того, файл .jrxml для всех отчетов хранится в каталоге, и я хочу подключить это местоположение к контексту отчета, чтобы при каждом нажатии на отчет во внешнем интерфейсе я хотел искать эти значения из контекста в службе отчетов / контроллере для создания отчета. Я знаю, что мы должны где-то делать ctx.getbean(ReportId), но я также хочу знать, как настроить компонент менеджера с некоторыми другими свойствами, такими как расположение шаблона, источник данных, карта параметров, reportid и объект jasperreportrenderrer. Таким образом, этот компонент ReportManager загружается повторно каждый раз, когда происходит вызов другого отчета, и в идеале сохраняется во время сеанса пользователя.

Ответ №1:

Вы должны быть в состоянии сделать что-то вроде этого:

 import org.springframework.context.*

class MyService implements ApplicationContextAware {
  ApplicationContext applicationContext

  def getBeanByName( String name ) {
    applicationContext.getBean( name )
  }
}
  

Это относится к Service классу grails, но то же самое должно быть справедливо и для контроллера