2013-08-09 8 views
2

Jetty помогает моему приложению слишком много. Всякий раз, когда некоторое необработанное исключение утечки из верхних, Jetty берет на себя, чтобы построить очень подробный ответ и спам его на мои клиентКак подавить ошибку JetHandler Jetty 8?

HTTP/1.1 500 com.mongodb.MongoException: No replica set members available in [ { address:'localhost/127.0.0.1:27017', ok:true, ping:0.49878865, isMaster:false, isSecondary:true, setName:dmReplSet, maxBsonObjectSize:16777216, },{ address:'localhost/127.0.0.1:27018', ok:true, ping:0.2565605, isMaster:false, isSecondary:true, setName:dmReplSet, maxBsonObjectSize:16777216, } ] for { "mode" : "primary"} 

вместе с 14K из StackTrace завернутого в очень хорошем HTML странице. Проблема в том, что я не хочу, чтобы информация о проблеме протекала для клиентов, и, кроме того, это приложение JSON Web App, принимающее и распространяющее приложение/json-контент. NOT Jet Jet решил, что мои клиенты хотят. Я хотел бы подавить эту ошибку обработки по умолчанию, когда Jetty испускает только этот стандартный ответ HTTP 500

HTTP/1.1 500 Internal Server Error 

и вообще нет тела. Как мне это сделать? Похоже, я должен просто сказать Jetty на «странице ошибок» в файле etc/jetty.xml или etc/jetty-webdefault.xml или что-то в этом роде.

ответ

2

Так это, кажется, наиболее легко решается без привязки себя Jetty слишком много от < ошибок-странице > в web.xml

<servlet> 
    <servlet-name>ErrorHandler</servlet-name> 
    <servlet-class>device.webapp.ErrorHandler</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>ErrorHandler</servlet-name> 
    <url-pattern>/ErrorHandler</url-pattern> 
</servlet-mapping> 

<error-page> 
    <exception-type>java.lang.Throwable</exception-type > 
    <location>/ErrorHandler</location> 
</error-page> 

Реализация ErrorHandler как

package device.webapp; 
import java.io.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 
import org.apache.commons.httpclient.*; 
import org.slf4j.*; 

/** 
* The ErrorHandler is intended to catch all unhandled Throwables (as configured in the web.xml) 
* before they get out to Jetty's verbose ErrorHandler. 
* 
*/ 
public class ErrorHandler extends HttpServlet { 

    private static final long serialVersionUID = 1L; 
    private Logger log = LoggerFactory.getLogger(ErrorHandler.class); 

    @Override 
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     // Analyze the servlet exception 
     Throwable throwable = (Throwable) req.getAttribute("javax.servlet.error.exception"); 
     String message = String.format(
       "Responding 500 - Server Error on URI %s", 
       req.getAttribute("javax.servlet.error.request_uri")); 
     if (throwable != null) { 
      log.error(message, throwable); 
     } else { 
      log.warn("Throwable should not be null!"); 
      log.error(message); 
     } 

     /* 
     * Interestingly enough, you can't resp.sendError(500, "Server Error") without triggering 
     * Jetty's DefaultErrorHandler which is the core of the problem we are trying to solve! 
     */ 
     resp.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR); 
    } 
} 

Это не очень, но он работает.

Смежные вопросы