Spring BootでJasperReports Libraryを使用する方法について。
PDFを生成するJasperReports LibraryはSpring Bootから使う事も出来る。
Spring Bootが依存しているSpring Web MVCには、JasperReportsでPDFを返すJasperReportsPdfViewクラスが用意されている。
ただし、JasperReportsPdfViewの中で使われているJasperReportsUtilsクラスは含まれていないので、build.gradleに追加する必要がある。
また、JasperReports Library自体も追加する必要がある。
〜 repositories { mavenCentral() maven { url 'http://jasperreports.sourceforge.net/maven2/' } } dependencies { compile('org.springframework.boot:spring-boot-starter-data-rest') // REST compile('org.springframework.boot:spring-boot-starter-security') // 認証 compile('org.springframework.boot:spring-boot-starter-thymeleaf') compile('org.thymeleaf.extras:thymeleaf-extras-springsecurity4') compile('org.springframework:spring-context-support') // JasperReportsUtils compile group: 'net.sf.jasperreports', name: 'jasperreports', version: '6.4.3' compile group: 'com.lowagie', name: 'itext', version: '2.1.7.js5' runtime('org.springframework.boot:spring-boot-devtools') testCompile('org.springframework.boot:spring-boot-starter-test') testCompile('org.springframework.security:spring-security-test') }
Spring Boot 1.5.6・JasperReports Library 6.4.3の例。
JasperReportsPdfViewは、Controllerのメソッドで直接返すようなものではないっぽい。
まず、Configの中でJasperReportsPdfViewのインスタンスを生成する。
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView;
@Configuration public class JasperReportsConfig { public static final String DATA_KEY = "JRDataSource"; @Autowired private ApplicationContext applicationContext;
@Bean(name = "example1") public JasperReportsPdfView example1() { JasperReportsPdfView view = new JasperReportsPdfView(); view.setUrl("classpath:com/example/jasperreports/example.jrxml"); view.setApplicationContext(applicationContext); // setUrlの後に記述 view.setReportDataKey(DATA_KEY); // view.addStaticAttribute("PARAM1", "default parameter"); return view; } }
jrxmlファイルはsetUrl()で指定する。
src/main/resourcesのcom.example.jasperreportsパッケージにあるexample.jrxmlは、先頭に「classpath:
」を付けて「classpath:com/example/jasperreports/example.jrxml
」となる。
(事前にコンパイルしたjasperファイルも指定可能)
ApplicationContextもJasperReportsPdfViewにセットする必要があるが、これはsetUrl()より後でなければならない。
(内部でgetUrl()している為)
setReportDataKey()で、データソースを示すキー名を定義する。
後述のmodelに対し、このキー名でデータソースをセットする。
addStaticAttribute()でパラメーターのデフォルト値をセットしておくことが出来る。
後述のmodelでパラメーターをセットしなかった場合、staticAttributeの値が使われる。
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView; import net.sf.jasperreports.engine.JRDataSource; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
@Controller public class JasperReportsController { @Autowired @Qualifier("example1") // @Beanに付けられた名前 private JasperReportsPdfView example1View;
@RequestMapping(path = "/jasper-reports") public ModelAndView pdf() { Map<String, Object> model = createParameters(); JRDataSource dataSource = createDataSource(); model.put(JasperReportsConfig.DATA_KEY, dataSource); return new ModelAndView(example1View, model); }
private Map<String, Object> createParameters() { Map<String, Object> parameters = new HashMap<>(); parameters.put("PARAM1", "parameter example"); return parameters; }
public static class ExampleBean { } private JRDataSource createDataSource() { List<ExampleBean> list = new ArrayList<>(); ExampleBean bean1 = new ExampleBean(); list.add(bean1); return new JRBeanCollectionDataSource(list); } }
jrxmlファイルに渡すパラメーターは、ModelAndViewに渡すmodelでセットする。
内部では、JasperReportsPdfViewのstaticAttributeとmodelの内容が合成されて使用される。同じキーがある場合はmodel側が優先。
データソースもmodelにセットする。
その際のキー名は、JasperReportsPdfViewのsetReportDataKey()で指定したもの。