2017-04-01 5 views
1

Wie kann ich den Standardantwortkörper deaktivieren, wenn Jetty eine Ausnahme abfängt und einen Fehler zurückgibt? Ich verwende keine XML oder WAR und möchte keine hinzufügen.Deaktivieren Sie den Standardfehlerantwortkörper in Jetty 9.4.2

Ich bevorzuge es, eine try { // Servlet code } catch (Exception e) { resp.setStatus(500) } in jedem Servlet zu tun.

Wenn ich das nicht tue, wird Jetty eine 500-Antwort mit einem Rumpf zurückgeben, der die Stapelverfolgung angibt. Wenn ein nicht gefundener Endpunkt erreicht wird, gibt Jetty eine 404-Antwort mit dem Text "Powered by Jetty" zurück. Ich möchte diese Körper entfernen und einfach den Antwortcode behalten.

Dies ist der Code, der meine Jetty-Server startet:

private static void startServer() throws Exception { 
    final org.eclipse.jetty.server.Server server = new org.eclipse.jetty.server.Server(7070); 
    final WebAppContext context = new WebAppContext("/", "/"); 
    context.setConfigurations(new Configuration[] { new AnnotationConfiguration(), new WebInfConfiguration() }); 
    context.setExtraClasspath("build/classes/main/com/example"); 
    server.setHandler(context); 
    server.start(); 
    server.join(); 
} 

Antwort

-1

Die Lösung in den Jetty documentation beschrieben:

Eine Klasse ErrorHandler Verlängerung erforderlich ist, um Jetty Standardverhalten außer Kraft zu setzen, wenn die Fehlerseite zu erzeugen. Es kann über den ContextHandler oder den Jetty-Server registriert werden.

Die CustomErrorHandler Klasse:

public class CustomErrorHandler extends ErrorHandler { 

    @Override 
    protected void writeErrorPage(HttpServletRequest request, Writer writer, int code, String message, boolean showStacks) throws IOException {} 
} 

Ich habe diese dann zu meiner Jetty eingebettete Konfiguration: context.setErrorHandler(new CustomErrorHandler());

1

In Ihrem WEB-INF/web.xml Ihrer WAR-Datei, geben Sie das <error-page> Element, um die Fehler zu behandeln verwenden möchten.

Beispiel:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
     version="3.1"> 
    <servlet> 
    <servlet-name>myerror</servlet-name> 
    <servlet-class>com.company.MyErrorServlet</servlet-class> 
    </servlet> 

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

    <error-page> 
    <location>/myerror</location> 
    </error-page> 
</web-app> 

Das <error-page> Element kann sehr mächtig sein.

Siehe andere Antwort auf https://stackoverflow.com/a/16340504/775715

+0

ich keine XML oder WAR Artefakt bin mit, Annotationen nur für Servlets. Gibt es eine programmatische Lösung? Wird in Ihrer Lösung jeder Fehler (500, 404 usw.) zum selben MyErrorServlet? Ich möchte denselben Fehlercode ohne den Jetty-Antwortkörper, der Daten verliert, zurückgeben. – niklabaz

+0

Die Tatsache, dass Sie einen 'WebAppContext' verwenden, bedeutet, dass Sie einen Krieg verwenden (es kann ein explodiertes Verzeichnis sein). Sie können keine Fehlerseite mit Annotationen angeben (es gibt keine Annotation), Sie müssen die Datei 'WEB-INF/web.xml' verwenden. Siehe die andere Antwort, um die Fehlerverteilung und die Attribute über den Fehlerstatus zu verstehen. –

Verwandte Themen