我通过下面的示例代码以这种方式启动了 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)
方法并进行相应处理。
关于java - 如何让jetty ErrorHandler在java中以json格式显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38620102/