web-dev-qa-db-fra.com

toResponse in maillot ExceptionMapper n'est pas invoqué

Donc, je construis une application Web, nous utilisons JPA et Jersey pour consommer/produire des données JSON.

J'ai un "EntityException" personnalisé ainsi qu'un "EntityExceptionMapper" personnalisé

Voici le mappeur:

  @Provider
public class EntityExceptionMapper implements ExceptionMapper<EntityException> {

    public EntityExceptionMapper() {
        System.out.println("Mapper created");
    }

    @Override
    public Response toResponse(EntityException e) {
        System.out.println("This doesnt print!");
        return Response.serverError().build();
    }
}

Mon exception:

public class EntityException extends Exception implements Serializable{

  public EntityException(String message) {
      super(message);
      System.out.println("This prints...");
  }

}

Et je l’appelle d’un appel REST:

@POST
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public String test() throws EntityException{
    throw new EntityException("This needs to be send as response!!");
    //return "test";
}

Mon problème est que, lorsque l'exception ci-dessus est levée, j'entre dans le constructeur (empreintes: "This empreinte ...") Edit: J'ai aussi le: "Mappeur créé!"

Mais ma réponse est vide et je n’arrive pas au système avec ma méthode toResponse. Cela ressemble vraiment à l'exemple sur le site Web du maillot:

https://jersey.Java.net/nonav/documentation/1.12/jax-rs.html#d4e435

Qu'est-ce que je rate??

10
alex

J'utilise un modèle d'application indépendant du déploiement et les éléments suivants ont fonctionné pour moi:

public class MyApplication extends Application {
    public Set<Class<?>> getClasses() {
        Set<Class<?>> s = new HashSet<Class<?>>();
        s.add(HelloWorldResource.class);

        /** you need to add ExceptionMapper class as well **/
        s.add(EntityExceptionMapper.class)
        return s;
    }
}
9
bluetech

J'ai eu un problème similaire où la ExceptionMapper avait la bonne annotation @Provider et le reste du code était identique à l'exemple de Jersey mais n'était toujours pas enregistré correctement.

Eh bien, il s’avère que j’ai dû enregistrer manuellement ma variable ExceptionMapper dans ma HttpServlet avec la méthode addExceptionMapper. Comme il est maintenant enregistré manuellement, l'annotation @Provider peut être supprimée en toute sécurité.

Donc, avec l'ExceptionMapper suivant (j'attrape chaque RuntimeException pour les renvoyer à 400)

public class MyCustomExceptionHandler implements ExceptionMapper<RuntimeException> {

  @Override
  public Response toResponse(RuntimeException exception) {
    return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build();
  }
}

Je devais ajouter la 2ème ligne dans mon init:

HttpServlet serviceServlet = jerseyServletFactory.create(someResource);
jerseyServletFactory.addExceptionMapper(new MyCustomExceptionHandler()); //<--

httpServer.register(serviceServlet, "/api");
httpServer.start();
4
Pierre-Luc Pineault

J'ai rencontré le même problème en développant l'exemple REST API. Lors de la création de l'API REST, j'ai donné le nom du paquet de base comme org.manish.rest.message.


  1. modèle - org.manish.rest.message.model
  2. base de données - org.manish.rest.message.database
  3. ressource - org.manish.rest.message.resource

dans web.xml init param a été donné comme ceci

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

Cela signifie que j’ai inscrit mon paquet de base dans web.xml, quel que soit le paquet que je vais créer avec cela; JAX-RS tiendra compte de mon appel et de mes besoins. Mais quand j'ai créé mon paquet d'exception par erreur, j'ai mis le nom du paquet org.manish.rest.exception. Comme cela n’était pas enregistré dans le fichier web.xml, ma classe d’exception complète n’a donc pas été considérée comme une exception par JAX-RS. En guise de correction, je viens de modifier le nom de mon paquet d'exception de org.manish.rest.exception à org.manish.rest.message.exception

Après cela, j'ai exécuté une fois en poste man et j'ai obtenu le résultat attendu.

J'espère que cela pourra résoudre votre requête.

Merci Manish

2
Kushwaha

J'ai eu le même problème et j'ai pu le résoudre en incluant le package de mon ExceptionMapper dans le fichier jersey.config.server.provider.packages dans mon fichier web.xml. Ci-dessous, un extrait de mon web.xml.

<servlet>
    <servlet-name>voteride-servlet</servlet-name>
    <servlet-class>
        org.glassfish.jersey.servlet.ServletContainer
    </servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>
            com.voteride.ws;com.voteride.errorHandling;org.codehaus.jackson.jaxrs
        </param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.scanning.recursive</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
2
Ross H Mills III

J'utilise Jersey JdkHttpServerFactory et il me suffisait d'ajouter la classe ExceptionMapper en tant que ressource, tout comme mes autres ressources de contrôleur:

import com.Sun.net.httpserver.HttpServer;
import javax.ws.rs.core.UriBuilder;
import Java.net.URI;
import Java.util.HashSet;
import Java.util.Set;
import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;

// ...

Set<Class> resources = new HashSet<>();
// Add whatever other resource classes you have...

//--->>> Add the exception mapper <<<---
resources.add(EntityExceptionMapper.class);

ResourceConfig resources = new ResourceConfig(resources);
URI uri = UriBuilder.fromUri("http://localhost/").build();
HttpServer server = JdkHttpServerFactory.createHttpServer(uri, resources);
1
brianmearns

Essayez d’enregistrer votre classe de mappeur d’exceptions dans votre fichier X. ResourceConfig . register (CustomExceptionMapper.class); cette ligne aidera l'application à trouver votre classe de mappeur et à renvoyer tout ce que vous avez écrit dans la méthode toResponse de la classe de mappeur

1
avinash

J'ai utilisé Spring pour câbler l'application pour jersey et utilisé @Component avec @Provider.

Lorsque je suis passé à jersey v> 2.5, il a cessé de fonctionner.

J'ai résolu ce problème en mettant l'annotation @Singleton à la place de @Component à côté de @Provider, comme suit:

@Provider
@Singleton
public class EntityExceptionMapper implements ExceptionMapper<EntityException> {...
1
mSolujic

Je suis également confronté au même problème. Il suffit d’ajouter le nom du package contenant les classes ExceptionMappperHandler.

<web-app version="2.5" xmlns="http://Java.Sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <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>Service,Utilities.ExceptionMapper</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

Ici, service contient toutes les classes de service et Utilities.ExceptionMapper contient tout exceptionMapper. J'espère son aide

0

J'utilise toujours le maillot 1.17, le printemps et le jersey-spring

L'annotation @Component corrige ce problème

0
Kalpesh Soni