2012-01-09 30 views
8

Tôi đang làm việc trên một dự án nhằm thay thế trình tạo PDF hiện tại của chúng tôi bằng JasperReports Server. Kế hoạch là sử dụng API REST/HTTP để đạt được mức trừu tượng cao giữa các hệ thống.Chuyển nội dung khi tạo báo cáo JasperServer bằng REST API

Tối ưu, chúng tôi không muốn để JasperReports Server lấy dữ liệu từ cơ sở dữ liệu, vì điều này sẽ bỏ qua việc ghi nhật ký và ủy quyền hiện có trong kiến ​​trúc của ứng dụng gọi điện. Thay vào đó, chúng tôi muốn bắt đầu với việc trích xuất nội dung trong ứng dụng gọi điện, sau đó chuyển nội dung đó tới JasperReports Server.

Chúng tôi đã thực hiện khá nhiều điều tra và việc thiếu các kết quả có liên quan cho thấy rằng đây không phải là cách bạn thường sử dụng JasperReports Server. Các tham số đầu vào trong các hướng dẫn mà chúng tôi đã tìm thấy thường là các giá trị vô hướng (số nguyên, boolean hoặc chuỗi) và không phải là các cấu trúc hoặc đối tượng phức tạp. Hơn nữa, có vẻ như nhiều hay ít mỗi mẫu giả định rằng bạn muốn cho JasperReports Server kết nối với một cơ sở dữ liệu.

Nếu có thể vượt qua các cấu trúc phức tạp (như một mảng bản đồ, nơi một số yếu tố bản đồ là mảng hoặc bản đồ), cách tốt nhất để thực hiện việc này là gì? Tôi không biết làm thế nào một cấu trúc nên được định dạng trong phần thân yêu cầu. API SOAP có phù hợp hơn không?

Nếu đây không phải là cách bạn nên thiết kế giải pháp Máy chủ JasperReports, các sản phẩm/giải pháp thay thế nào phù hợp hơn?

Cảm ơn trước về mọi đầu vào.

+0

Bạn có thể sử dụng toán tử 'get' để nhận tệp mẫu của báo cáo (JRXML). Sau đó, bạn có thể chuyển đến báo cáo mọi thứ bạn muốn (với sự trợ giúp của JasperReports API). Ví dụ: bạn có thể chuyển Bean làm nguồn dữ liệu hoặc chuyển thông số Map as. –

+0

Cảm ơn câu trả lời của bạn Alex. Như tôi vừa viết dưới đây, tôi đã quyết định đi theo một cách tiếp cận khác. Bất kể, tôi không chắc chắn tôi thấy điểm trong lấy JRXML bằng cách sử dụng API HTTP ... – MaxH

Trả lời

7

Sau vài giờ dành cho nghiên cứu, tôi nghĩ rằng tôi đã sẵn sàng trả lời câu hỏi của riêng mình.

JasperReports Server ("JRS" bên dưới) được thiết kế cơ bản để tìm nạp dữ liệu của chính nó. Mặc dù nó sẽ có thể lực lượng JRS thức ăn với dữ liệu, tôi đã quyết định không.

Một trong những hạn chế rõ ràng nhất của việc không cho phép JRS tìm nạp dữ liệu chính là nó sẽ không còn có thể tạo báo cáo từ giao diện web JRS nữa. Tích hợp từ các hệ thống khác cũng trở thành không thể hoặc khó khăn nếu ứng dụng khách chịu trách nhiệm cung cấp dữ liệu theo định dạng được xác định trước.

Trong dự án tôi đang làm việc, chúng tôi đã quyết định xây dựng một JRS DataSource tùy chỉnh dựa trên Nguồn dữ liệu XML từ xa, sẽ gọi API XML của ứng dụng khách. Nói cách khác, ứng dụng khách yêu cầu một báo cáo từ JRS, và JRS sau đó yêu cầu dữ liệu của nó từ ứng dụng khách. XML API sẽ phải được mở rộng để bao gồm tất cả các nhu cầu báo cáo của chúng tôi, nhưng đó là một điều tốt trong quan điểm của tôi. Bảo hiểm API tốt sẽ có ích trong tương lai.

Tôi hy vọng những suy nghĩ này sẽ giúp ai đó có câu hỏi tương tự.

+0

Câu trả lời hay. Đã trả lời câu hỏi của riêng bạn, nhưng bạn không cần phải chấp nhận câu trả lời của bạn. Bạn nên chấp nhận của bạn. – mdahlman

0

Như bạn đã viết, tìm nạp dữ liệu là cách tự nhiên hơn cho JRS. Tuy nhiên, tôi cần phải đi ngược lại - tôi POST dữ liệu để báo cáo ngồi trong JRS repo thông qua một cuộc gọi REST.

Tôi chuyển dữ liệu XML vào tham số "xmlDocument" và bằng "mẹo", báo cáo được thực thi có thể sử dụng XML này để truy vấn đường dẫn X nữa.

XmlDocument chỉ là một chuỗi đơn giản:

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

Tại giai đoạn thiết kế tôi có thể tạo bộ chuyển đổi dữ liệu XML với tập tin XML mà tôi sử dụng cho xem trước. Lưu ý rằng một tham số mới XML_INPUT_STREAM xuất hiện sau khi chọn bộ điều hợp XML.

Sau đó, tôi xuất bản báo cáo lên JRS. Trong thực hiện báo cáo, khi báo cáo không liên quan đến bất kỳ nguồn dữ liệu, nó đọc thông số XML_INPUT_STREAM thay vì (như nguồn dữ liệu dự phòng), trông như sau:

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

tôi quấn "XmlDocument" chuỗi để InputStream.

Các vấn đề liên quan