Как мы можем передать информацию заголовка в JsonDataSource?

#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, где это может быть обработано соответствующим образом.