java - 如何让jetty ErrorHandler在java中以json格式显示错误

标签 java rest jersey embedded-jetty

我通过下面的示例代码以这种方式启动了 jetty 服务器,我在其中编写了自己的 errorHandler 类。通过一些研究,我得到了一些信息here.但这似乎不足以让我得到我想要的。我设置的服务器调用类的名称是HandleClient。

因此,如果发生错误 404,它会显示 {"message":"HTTP error 404"} 。该程序无论如何都可以正常工作但是响应是文本/纯格式。

我的问题是:如何配置类以格式化并显示 MIME MediaType 中的错误:application/json。

为此我睡不着觉。将非常感谢所有帮助。

    public class MVCPattern{

    public MVCPattern(){
    }

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


        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("\"}");
        }
    }

}

最佳答案

您应该检查 HttpServletRequest.getHeader("Accept") 中的 Accept header ,首先查看客户端是否可以接受该类型。

然后使用 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例如它的使用。

关于java - 如何让jetty ErrorHandler在java中以json格式显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38620102/

相关文章:

java - 有没有办法让lombok在使用@Getter @Setter注释时在null的情况下创建一个对象?

java - 这是编写异步迭代器的正确方法吗?

java - 在 Spring Boot 2.2.0 应用程序中点击 REST 端点时出现问题

java - 使用 jersey-Rest 的 Post 方法并从 url 获取参数

java - 是否可以在 Android 中运行 H2O 模型?

node.js - 为什么 req.body 在 POSTMAN 中返回 undefined

java - 使用 MultiActionController 定义 Spring Rest API

Spring + Hibernate + jersey 中的 java.lang.ExceptionInInitializerError

java - Dropwizard Response.status(Response.Status.NOT_FOUND).build() 返回 html

java - 在同一方法中使用准备好的语句时如何绕过或避免列更新?