S-JIS[2017-11-25] 変更履歴

Spring Boot JasperReports Library

Spring BootJasperReports Libraryを使用する方法について。


概要

PDFを生成するJasperReports LibraryはSpring Bootから使う事も出来る。

Spring Bootが依存しているSpring Web MVCには、JasperReportsでPDFを返すJasperReportsPdfViewクラスが用意されている。
ただし、JasperReportsPdfViewの中で使われているJasperReportsUtilsクラスは含まれていないので、build.gradleに追加する必要がある。
また、JasperReports Library自体も追加する必要がある。

build.gradle:

〜
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')
}

JasperReportsPdfViewの例

Spring Boot 1.5.6・JasperReports Library 6.4.3の例。

JasperReportsPdfViewは、Controllerのメソッドで直接返すようなものではないっぽい。


Config

まず、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の値が使われる。


Controller

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()で指定したもの。


Spring Bootへ戻る / Spring Frameworkへ戻る / 技術メモへ戻る
メールの送信先:ひしだま