2016-07-27 6 views
2

私は自分自身のerrorHandlerクラスを作成したサンプルコードでこの方法でjettyサーバーを起動しました。いくつかの調査を通して、私はいくつかの情報を得ましたhere.しかし、それは私が欲しいものを得るのに十分ではないようです。サーバーによって呼び出されるように設定されているクラスの名前は、HandleClientです。jetty ErrorHandlerがJavaでjson形式でエラーを表示する方法

エラー404が発生した場合は、{"message":"HTTP error 404"}と表示されます。とにかくプログラムは正常に動作しますが、応答はテキスト/プレーン形式です。

問題: MIME MediaType:application/jsonでエラーをフォーマットして表示するにはどうすればよいでしょうか。

私はこれで眠れない夜を過ごしました。すべての助けに非常に感謝します。

public class MVCPatternNsano{ 

    public MVCPatternNsano(){ 
    } 

    public static void main(String args[]) throws JSONException, IOException{ 
     MVCPatternNsano mvcPatternNsano = new MVCPatternNsano(); 


     ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
     context.setContextPath("/"); 

     Server jettyServer = new Server(9000); 
     jettyServer.setHandler(context); 
     context.setErrorHandler(new ErrorHandler()); 
     // default error handler for resources out of "context" scope 
     jettyServer.addBean(new ErrorHandler()); 

     ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*"); 
     jerseyServlet.setInitOrder(0); 

     // Tells the Jersey Servlet which REST service/class to load. 
     jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", 
       HandleClient.class.getCanonicalName()); 

     try { 
      jettyServer.start();    
      jettyServer.join(); 

     } catch (Exception ex) { 
      Logger.getLogger(HandleClient.class.getName()).log(Level.SEVERE, null, ex); 
     } finally { 
      jettyServer.destroy(); 
     } 
    } 
    /** 
    * Dummy error handler that disables any error pages or jetty related messages and returns our 
    * ERROR status JSON with plain HTTP status instead. All original error messages (from our code) are preserved 
    * as they are not handled by this code. 
    */ 
    static class ErrorHandler extends ErrorPageErrorHandler { 
     @Override 
     public void handle(String target, org.eclipse.jetty.server.Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException { 
      response.getWriter() 
      .append("{\"message\":\"HTTP error ") 
      .append(String.valueOf(response.getStatus())) 
      .append("\"}"); 
     } 
    } 

} 

答えて

1

あなたは、クライアントがそのタイプを受け入れることができるかどうか最初に確認するためにHttpServletRequest.getHeader("Accept")Acceptヘッダーを確認する必要があります。

次に、HttpServletResponse.setContentType("text/json")を使用して応答のコンテンツタイプを設定します。

また、Jetty 9.3.11.v20160721(またはそれ以降)を使用している場合は、ErrorHandler.generateAcceptableResponse(Request baseRequest, HttpServletRequest request, HttpServletResponse response, int code, String message, String mimeType)メソッドをオーバーライドしてそれに応じて処理することができます。

参照:https://github.com/eclipse/jetty.project/blob/jetty-9.3.11.v20160721/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java#L196-L226例えば、その使用について。

関連する問題