#java #json #jasper-reports #datasource
#java #json #jasper-отчеты #источник данных
Вопрос:
Мы используем конечную точку REST в качестве источника данных для отчетов jasper, но везде, где используется точка REST, обязательно создать адаптер с URL-адресом rest и информацией заголовка и использовать его в качестве источника данных.
Мы не хотим использовать адаптер, вместо этого мы хотим использовать непосредственно конструктор
public JsonDataSource(String location, String selectExpression) throws JRException
в качестве выражения набора данных мы сформировали выражение следующим образом.
new net.sf.jasperreports.engine.data.JsonDataSource("http://vagrant.ptcnet.ptc.com:2280/Windchill/trustedAuth/servlet/odata/D...","value")
Однако эта конкретная конечная точка ожидает некоторую информацию заголовка от запрашивающего ("Accept", "application/json")
, иначе она выдает неверное исключение как ошибку
Есть ли какой-либо способ, которым мы можем передать информацию заголовка здесь?
Ответ №1:
Вам нужно использовать конструктор, в котором вы передаете InputStream
<a rel=»noreferrer noopener nofollow» href=»https:///jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/data/JsonDataSource.html#(java.io.InputStream,java.lang.String)» rel=»nofollow noreferrer»>
public JsonDataSource(java.io.InputStream jsonStream,java.lang.String selectExpression)
Вероятно, самый простой способ предоставить входной поток — это создать метод в вашем java-проекте, который выполняет запрос и возвращает результат, например, в ByteArrayInputStream
Если вам нужно сделать это непосредственно в отчете (jrxml), вам нужно сделать это в 1 выражении (jrxml не поддерживает многострочный код). В этом случае вы могли бы использовать apache HttpClients
, который уже включен в качестве зависимости от проекта отчета jasper.
Это может быть что-то вроде этого
new net.sf.jasperreports.engine.data.JsonDataSource(
org.apache.http.impl.client.HttpClients.createDefault().execute(
org.apache.http.client.methods.RequestBuilder.
get().
setUri("http://vagrant.ptcnet.ptc.com:2280/Windchill/trustedAuth/servlet/odata/D...").
setHeader("Accept", "application/json").
build()
)
.getEntity()
.getContent()
,""
)
getContent()
Вернет отчеты, InputStream
и jasper закроет этот поток, когда это будет сделано. Однако теоретически и клиент, и ответ на выполнение Closable
являются, что означает, что обычно вы должны вызывать close()
, чтобы освободить ресурс, поэтому я не уверен, что достаточно закрыть только входной поток, вы можете рискнуть утечкой ресурса. Вот почему я изначально предложил создать метод в проекте / a java, где это может быть обработано соответствующим образом.