2015-10-28 17 views
5

Ich versuche, diesen Ausnahme-Mapper aufzurufen, um eine nicht gefundene 404-Antwort zurückzugeben, aber es wird immer 500 interner Fehler zurückgegeben. Jersey Version ist 2.22.1. Code-Ausschnitt unten. Schätze alle Hilfe.Jersey ExceptionMapper wird nicht aufgerufen

Danke.

Ausnahme-Mapper-Klasse.

package org.learn.rest.messengerdemo.exception; 

import javax.ws.rs.core.Response; 
import javax.ws.rs.core.Response.Status; 
import javax.ws.rs.ext.ExceptionMapper; 
import javax.ws.rs.ext.Provider; 

@Provider 
public class DataNotFoundExceptionMapper implements ExceptionMapper<DataNotFoundException>{ 

    @Override 
    public Response toResponse(DataNotFoundException ex) { 
     return Response.status(Response.Status.FORBIDDEN).build(); 
    } 
} 

Ausnahmeklasse.

Paket org.learn.rest.messengerdemo.exception;

public class DataNotFoundException extends RuntimeException{ 

    private static final long serialVersionUID = 2176642539344388961L; 

    public DataNotFoundException(String message) 
    { 
     super(message); 
    } 
} 

Methode der Serviceklasse, die auslöst.

public Message getMessage(long messageId) { 
    Message message = messages.get(messageId); 
    if(message == null) 
    { 
     throw new DataNotFoundException("Message with id " + messageId + " not found"); 
    } 
    return message; 
} 

Und die Ressourcenklasse.

@GET 
@Path("/{messageId}") 
public Message getMessage(@PathParam("messageId") long messageId) { 
    return messageService.getMessage(messageId); 
} 

Antwort

14

Mit Blick auf die web.xml von Ihrem previous question, haben Sie diese

<servlet> 
    <servlet-name>Jersey Web Application</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>org.learn.rest.messengerdemo.resources</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

Was init-Parm jersey.config.server.provider.packages sagt ist, dass Jersey das genannte Paket für @Path kommentierte Ressourcenklasse scannen und @Provider kommentierte Provider-Klassen und registriere sie.

Sie haben nur das Ressourcenpaket org.learn.rest.messengerdemo.resources aufgelistet, aber Sie ExceptionMapper ist in einem anderen Paket. Das Standardverhalten besteht darin, rekursiv zu scannen, also auch Unterpakete. Wenn Sie stattdessen org.learn.rest.messengerdemo auflisten, würden Sie sowohl das Ressourcenpaket als auch das Paket Exceptions schlagen. Oder Sie könnten beide Pakete auflisten, getrennt durch Komma oder Semikolon. So oder so würde funktionieren

<param-value>org.learn.rest.messengerdemo</param-value> 
<!-- OR --> 
<param-value> 
    org.learn.rest.messengerdemo.resources, 
    org.learn.rest.messengerdemo.exception 
</param-value> 
1

Bitte beachten Sie, dass dies kein Problem der Annotation ist. Ich habe gesehen, dass Leute Kommentare gegeben haben, die wegen @Provider Annotation nicht registriert sind, wenn Sie den richtigen Provider importiert haben, wird es funktionieren. Finden Sie meine Lösung unter

Ich habe das gleiche Problem bei der Entwicklung von Beispiel REST API. Während REST API zu schaffen i wie org.manish.rest.message Basispaket Namen gegeben haben, sollte ich wie dieses

  1. Modell alle anderen Pakete unter dem Basispaket erstellen - org.manish.rest.message.model
  2. Datenbank - org.manish.rest.message.database
  3. Ressource - org.manish.rest.message.resource

in web.xml init param wurde wie diese

<init-param> 
      <param-name>jersey.config.server.provider.packages</param-name> 
      <param-value>org.manish.rest.message</param-value> 
</init-param> 
gegeben

Es bedeutet, ich habe mein Basispaket in web.xml registriert, was auch immer ich unter diesem Paket erstellen werde; wird von JAX-RS aufgrund meines Rufes und Anforderung berücksichtigt. Aber wenn ich versehentlich mein Ausnahmepaket erstellt habe, habe ich den Paketnamen org.manish.rest.exception angegeben. Da dies nicht in web.xml registriert war, wurde meine komplette Ausnahmeklasse nicht als eine Ausnahme von JAX-RS behandelt.Als Korrektur habe ich gerade meinen Ausnahmepaketnamen von org.manish.rest.exception zu org.manish.rest.message.exception

geändert, nachdem ich einmal in Pfostenmann ausgeführt habe und ich erwartetes Ergebnis erhielt.

Hoffe, das kann Ihre Abfrage lösen.

Dank Manish

0

Ich möchte eine andere Option schlagen ... Änderung des Mapper Paket, um das Ressourcenpaket entsprechen, wo die Ausnahme der Regel gefangen werden kann.

das Ressource Klassen-Pakets Unter der Annahme:

package org.learn.rest.messengerdemo.resources; 

das Mapper-Klasse Paket Wechsel von:

package org.learn.rest.messengerdemo.exception; 

zu:

package org.learn.rest.messengerdemo.resources; 

Auf diese Weise werden Sie nicht mit seinem Hantieren Framework generierte Dateien oder ungewöhnliche Syntax.

Ich verstehe immer noch nicht, warum ein try/catch nicht verwendet wird, aber ich baue mein Java-Wissen neu, also werde ich keine Meinung einbringen oder eine Anfrage stellen. Wenn es seine derzeitige Praxis ist, werde ich das bald genug lernen. Und Mapper sind eine interessante Gelegenheit dazu.