2012-01-09 3 views
8

저는 현재 PDF 생성기를 JasperReports Server로 바꾸는 것을 목표로하는 프로젝트를 진행하고 있습니다. 이 계획은 REST/HTTP API를 사용하여 시스템간에 높은 수준의 추상화를 달성하는 것입니다.REST API를 사용하여 JasperServer 보고서를 생성 할 때 컨텐트를 전달합니다.

최적의 방법으로, JasperReports Server가 데이터베이스에서 데이터를 가져 오지 않게하려면 호출하는 응용 프로그램의 아키텍처에서 기존 로깅 및 권한 부여를 건너 뛰기 때문에. 대신, 호출하는 응용 프로그램에서 내용을 추출한 다음 JasperReports Server에 해당 내용을 전달하는 것으로 시작하려고합니다.

우리는 많은 조사를 해 왔으며 관련 결과가 없다는 것은 이것이 일반적으로 JasperReports Server를 사용하는 방법이 아니라는 것을 나타냅니다. 우리가 찾은 튜토리얼의 입력 매개 변수는 일반적으로 복잡한 구조 나 객체가 아닌 스칼라 값 (정수, 부울 또는 문자열)입니다. 또한, 모든 샘플은 JasperReports Server가 데이터베이스에 연결되도록하려는 것으로 보입니다.

복잡한 구조 (지도 배열, 일부지도 요소가 배열 또는지도 인 경우)를 전달할 수 있다면이를 수행하는 가장 좋은 방법은 무엇일까요? 이러한 구조가 요청 본문에서 어떻게 형식화되어야하는지 전혀 모르겠습니다. SOAP API가 더 잘 맞습니까?

JasperReports Server 솔루션을 설계하는 방법이 전혀 없다면 어떤 대안 제품/솔루션이 더 적합합니까?

미리 알려 주셔서 감사합니다.

+0

보고서 템플리트 (JRXML) 파일을 가져 오기 위해'get' 연산자를 사용할 수 있습니다. 그런 다음 원하는 모든 것을 보고서에 전달할 수 있습니다 (JasperReports API 사용). 예를 들어 Bean을 데이터 소스로 전달하거나 Map을 매개 변수로 전달할 수 있습니다. –

+0

답장을 보내 주셔서 감사합니다. 방금 아래에서 쓴 것처럼 다른 접근 방식을 사용하기로 결정했습니다. 그럼에도 불구하고 HTTP API를 사용하여 JRXML을 가져 오는 것이 중요하다는 것을 확신하지 못했습니다. – MaxH

답변

7

연구에 몇 시간을 소비 한 후 내 자신의 질문에 대답 할 준비가되었다고 생각합니다.

JasperReports Server (이하 "JRS")는 기본적으로 데이터를 가져올 수 있도록 설계되었습니다. 데이터로 피드 JRS를 강제 실행하는 것이 가능할지라도, 나는하지 않기로 결정했습니다.

JRS가 데이터 자체를 가져 오지 않도록하는 가장 분명한 단점 중 하나는 더 이상 JRS 웹 인터페이스에서 보고서를 생성 할 수 없다는 것입니다. 클라이언트 응용 프로그램이 미리 정의 된 형식으로 데이터를 제공 할 책임이있는 경우 다른 시스템과의 통합도 불가능하거나 어려워집니다.

저는 프로젝트에서 클라이언트 XML API를 호출하는 원격 XML 데이터 소스를 기반으로 맞춤 JRS 데이터 소스를 작성하기로 결정했습니다. 즉, 클라이언트 응용 프로그램이 JRS로부터 보고서를 요청하면 JRS는 클라이언트 응용 프로그램에서 해당 데이터를 요청합니다. Google의 모든보고 요구를 충족시키기 위해 XML API를 확장해야하지만 이는 제 의견으로는 좋은 방법입니다. 좋은 API 적용 범위는 장래에 도움이 될 것입니다.

이러한 생각이 비슷한 질문을하는 데 도움이되기를 바랍니다.

+0

좋은 답변입니다. 자신 만의 질문에 대답했을 때 대답을 받아 들일 필요는 없습니다. 너는 너의 것을 받아 들여야한다. – mdahlman

0

작성한대로 데이터를 가져 오는 것이 JRS에서 더 자연스러운 방법입니다. 그러나 나는 반대 방향으로 갈 필요가 있었다. 나는 POST 데이터를 REST 호출을 통해 JRS 레포에 앉아있는 것으로보고했다.

"xmlDocument"매개 변수에서 XML 데이터를 전달하고 "트릭"을 통해 실행 된 보고서는이 XML을 이후 X- 경로 쿼리에 사용할 수 있습니다. 내가 미리보기에 사용할 XML 파일을 사용하여 XML 데이터 어댑터를 만들

<parameter name="xmlDocument" class="java.lang.String"> 
    <defaultValueExpression><![CDATA["<?xml version=\"1.0\" encoding=\"UTF-8\"?><documentData></documentData>"]]></defaultValueExpression> 
</parameter> 

설계 단계에서 :

을 XmlDocument는 단순한 문자열입니다. XML 어댑터를 선택하면 XML_INPUT_STREAM이라는 새 매개 변수가 나타납니다.

그런 다음 보고서를 JRS에 게시합니다. 보고서 실행시 은 보고서가 모든 데이터 소스에 연결되지 않은 경우, 그것은 다음과 같이 그 보인다 (대체 데이터 소스로) 대신 XML_INPUT_STREAM 매개 변수를 읽

<parameter name="XML_INPUT_STREAM" class="java.io.InputStream" isForPrompting="false"> 
    <defaultValueExpression><![CDATA[new java.io.ByteArrayInputStream($P{xmlDocument}.getBytes("UTF-8"))]]></defaultValueExpression> 
</parameter> 

내가의 InputStream을 "이 XMLDocument"문자열을 포장.

관련 문제