Вопрос: toResponse в джерси ExceptionMapper не вызывается


Поэтому я создаю веб-приложение, мы используем JPA и Jersey для потребления / производства данных JSON.

У меня есть обычное «EntityException», а также пользовательский «EntityExceptionMapper»,

Вот картинка:

  @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();
    }
}

Мое исключение:

public class EntityException extends Exception implements Serializable{

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

}

И я звоню по вызову 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";
}

Моя проблема в том, что, когда выбрано вышеописанное исключение, я попадаю в конструктор (prints: «This prints ...») Edit: Я также получаю: «Созданный Mapper!».

Но мой ответ пуст, и я не добираюсь до sys из моего метода toResponse. Это действительно похоже на пример на веб-сайте Джерси:

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

Что мне не хватает?


9


источник


Ответы:


Я использую модель агностического развертывания, поэтому для меня это работало:

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;
    }
}

8



У меня была аналогичная проблема, когда ExceptionMapper имел надлежащий @Provider аннотация и остальная часть кода были идентичны примеру Джерси, но все еще не были зарегистрированы должным образом.

Ну, оказывается, мне пришлось вручную регистрировать свой обычай ExceptionMapper в моей HttpServlet с помощью метода addExceptionMapper, Поскольку он теперь зарегистрирован вручную, @Provider аннотация может быть безопасно удалена.

Итак, со следующим ExceptionMapper (я поймаю каждый RuntimeException восстановить их как 400)

public class MyCustomExceptionHandler implements ExceptionMapper<RuntimeException> {

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

Мне пришлось добавить вторую строку в мой init:

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

httpServer.register(serviceServlet, "/api");
httpServer.start();

4



У меня была такая же проблема, и я смог ее исправить, включив пакет моего ExceptionMapper в файл jersey.config.server.provider.packages в моем файле web.xml. Ниже приведен фрагмент из моего 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



Я использовал весну для подключения приложения джерси и использовал @Component с @Provider.

Когда я перешел на майку v> 2,5, она перестала работать.

Я решил эту проблему, добавив @Singleton-аннотацию вместо @Component вместе с @Provider, например:

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

1



Я использую Джерси JdkHttpServerFactory, и мне просто пришлось добавить ExceptionMapper класс как ресурс, как и другие ресурсы контроллера:

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



Попробуйте зарегистрировать свой класс mapper исключений в своем X расширяет ResourceConfig  файл. Регистр (CustomExceptionMapper.class); эта строка поможет приложению найти ваш класс сопоставления и вернуть все, что вы написали внутри метода toResponse класса mapper


1



Я столкнулся с той же проблемой при разработке образца REST API. При создании REST API я дал базовое имя пакета, например org.manish.rest.message, Я должен создавать все остальные пакеты под базовым пакетом, как это


  1. модель - org.manish.rest.message.model 
  2. база данных - org.manish.rest.message.database 
  3. ресурс - org.manish.rest.message.resource

в файле web.xml init param был указан так:

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

Это означает, что я зарегистрировал свой базовый пакет в web.xml, какой бы пакет я ни создавал под этим; будет рассмотрен JAX-RS на основе моего требования и требования. Но когда я создал свой пакет исключений по ошибке, я ставлю имя пакета org.manish.rest.exception. Поскольку это не было зарегистрировано в web.xml, поэтому мой полный класс исключений не считался обработкой исключения JAX-RS. В качестве коррекции я только что изменил имя пакета исключений из org.manish.rest.exceptionв org.manish.rest.message.exception

После этого я выполнил один раз в post man и получил ожидаемый результат.

Надеюсь, это может решить ваш запрос.

благодаря Manish


1



Я все еще использую майку 1.17, весну и джерси-весну

@ Компонентная аннотация фиксирует это


0



Я также сталкиваюсь с той же проблемой. Просто добавьте имя пакета, в котором есть классы 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>

Здесь служба содержит все классы обслуживания и Utilities.ExceptionMapper содержит все exceptionMapper. Надеюсь, его помощь


0