2017-06-05 74 views
0

TomeeでHTTPサーバーを作成していますが、webappディレクトリにジャスパーレポートファイル(.jasper)が配置されています。ブラウザでhttp://localhost:8080/test.jasperにアクセスすると、ブラウザはファイルのダウンロードを促します。HTTPサーバーで.jasperファイルを提供するにはどうすればよいですか?

私のJavaプロジェクトでは、そのリンクにアクセスしてレポートをプレビューする簡単なコードを作成しています。私はasync-http-clientライブラリをリクエストしています。私のコードから

DefaultAsyncHttpClient client = new DefaultAsyncHttpClient(); 
BoundRequestBuilder brb = client.prepareGet("http://localhost:8765/qa/test.jasper"); 
Future<InputStream> f = brb.execute(new AsyncCompletionHandler<InputStream>() { 
    @Override 
    public InputStream onCompleted(Response resp) { 
     try { 
      String[][] data = {{"Jakarta"},{"Surabaya"},{"Solo"},{"Denpasar"}}; 
      String[] columnNames = {"City"}; 
      DefaultTableModel dtm = new DefaultTableModel(data, columnNames); 

      Map<String,Object> params = new HashMap<>(); 

      JasperPrint jPrint = JasperFillManager.fillReport(
       resp.getResponseBodyAsStream(), 
       params, 
       new JRTableModelDataSource(dtm) 
      ); 
      JasperViewer jpView = new JasperViewer(jPrint,false); 
      jpView.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      jpView.setSize(800, 600); 
      jpView.setLocationRelativeTo(null); 
      jpView.setVisible(true); 

     } catch (JRException ex) { 
      System.out.println(ex.getMessage()); 
     } 
     return resp.getResponseBodyAsStream(); 
    } 
}); 

は、上記の、私は通常、私は

InputStream input = MainContext.class.getResourceAsStream(filename); 

を使用することができますが、私は(あまりにストリーム)httpリクエストでファイル入力ストリームを交換したいエラーError loading object from InputStream

を得ました。

私はどのようにhttpサーバで.jasperファイルを処理できますか... ...?

+1

通常、 '.jasper'ファイルは提供されません。むしろ '.pdf'や' .csv'などの出力ファイルはサーバ側が '.jasper'ファイルを実行した後に利用可能になります。ユーザーが '.jasper'ファイルをダウンロードすることを期待している場合を除いて、Jaspersoft Studioにダウンロードしてインストールすることを意味し、それを実行し、データベース接続を管理します。 –

+0

はい私は、ユーザがレポートをダウンロードした後、作成するJavaアプリケーションを介して、 '.jasper'ファイルをダウンロードしたいと思っています。レポートは定期的なレポートとしてユーザに表示されます。 – yuda

答えて

0

Error loading object from InputStreamエラーは、私がブラウザ経由で正常に.jasperファイルをダウンロードし、JRLoader.loadObjectFromFile(path to file)でレポートを実行した場合tomeeは、破損したファイル(ソースファイル破損していない)を与えるので、それは、あまりにも動作しますしない、破損しInputStreamから来ました。

私自身の解決策は、ソースファイルをストリームとして読み込み、base64エンコードに変換し、HTTP APIプロトコルで提供します。クライアント側の内部

finput = new FileInputStream(sPath); 
byte[] bFile = Base64.getEncoder().encode(IOUtils.toByteArray(finput)); 

String sFile = new String(bFile); 

、私はInputStreamに変換し、最後にInputStreamでレポートを実行し、base64文字列をデコードし、身体の文字列としてそれを受け取りました。

byte[] bBody = Base64.getDecoder().decode(sBody); 
InputStream mainReport = new ByteArrayInputStream(bBody); 
return JasperFillManager.fillReport(mainReport, params); 
関連する問題