2

Wir arbeiteten an einer Jersey-Webanwendung mit einem Team, als das Projekt immer größer wurde. Wir entschieden uns daher, von Tomcat zu Grizzly zu wechseln, um Teile des Projekts auf verschiedenen Portnummern bereitzustellen . Was ich jetzt herausgefunden habe, dass die benutzerdefinierte Ausnahmebehandlung, die wir haben, nicht funktioniert, stattdessen bekomme ich immer die Grizzly-HTML-Seite.JAX-RS Exception Mapper funktioniert nicht im Grizzly-Container

Beispiel Ausnahme:

public class DataNotFoundException extends RuntimeException{ 

private static final long serialVersionUID = -1622261264080480479L; 

public DataNotFoundException(String message) { 
    super(message); 
    System.out.println("exception constructor called"); //this prints 
} 
} 

Mapper:

@Provider 
public class DataNotFoundExceptionMapper implements ExceptionMapper<DataNotFoundException>{ 

public DataNotFoundExceptionMapper() { 
    System.out.println("mapper constructor called"); //doesnt print 
} 

@Override 
public Response toResponse(DataNotFoundException ex) { 
    System.out.println("toResponse called"); //doesnt print 
    ErrorMessage errorMessage = new ErrorMessage(ex.getMessage(), 404, "No documentation yet."); 
    return Response.status(Status.NOT_FOUND) 
      .entity(errorMessage) 
      .build(); 
     //ErrorMessage is a simple POJO with 2 string and 1 int field 
} 

} 

Ich bin nicht sicher, wo das Problem Quelle ist, wenn ich brauchte mehr Informationen/Code zur Verfügung stellen kann. Was ist das Problem, was kann ich versuchen?

EDIT:

Main.class:

public class Main { 

/** 
* Main method. 
* @param args 
* @throws Exception 
*/ 
public static void main(String[] args) throws Exception { 

... 

    List<ServerInfo> serverList = new ArrayList<ServerInfo>(); 

    serverList.add(new ServerInfo(
      "api",8450, 
      new ResourceConfig().registerClasses(
        the.package.was.here.ApiResource.class) 
      ));    

    for(ServerInfo server : serverList) { 
     server.start(); 
    } 

    System.out.println("Press enter to exit..."); 
    System.in.read(); 

    for(ServerInfo server : serverList) { 
     server.stop(); 
    } 

} 
} 

EDIT2: basierend auf this Frage habe ich diese ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, "true" Eigenschaft versucht, mit, die nur ein wenig geholfen. Ich bekomme immer noch die HTML-Grizzly-Seite, wenn die Ausnahme passiert, aber jetzt sehe ich meine Ausnahme (+ Stack-Trace) im Körper der Seite.

+0

Der Mapper wird wahrscheinlich nicht registriert. Können Sie Ihre App-Konfiguration anzeigen? –

+0

meinst du den Code, der die Server startet? Abhängigkeiten? –

+0

Nur Server-Code, mindestens zeigt die ResourceConfig –

Antwort

2

Sie sind nur eine Ressourcenklasse für die gesamte Anwendung Registrierung

new ResourceConfig().registerClasses(
     eu.arrowhead.core.api.ApiResource.class 
) 

Der Mapper registriert werden muss auch

new ResourceConfig().registerClasses(
     eu.arrowhead.core.api.ApiResource.class, 
     YourMapper.class) 
) 

Sie auch Paket-Scanning verwenden können, die alle Klassen abholen und registriert sie automatisch, wenn sie mit @Path oder @Provider

gekennzeichnet sind
+0

danke, ich werde es ausprobieren :) Ich werde deine Antwort akzeptieren, wenn ich es funktionierte –

+0

das funktioniert für mich, das gleiche Problem wurde angetroffen und nach der Registrierung der Mapper, ich in der Lage, die gemappte Ausnahme zu bekommen. Danke für die Antwort –