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