【问题标题】:toResponse in jersey ExceptionMapper does not get invoked球衣 ExceptionMapper 中的 toResponse 没有被调用
【发布时间】:2014-04-20 05:32:07
【问题描述】:

所以我正在构建一个 Web 应用程序,我们正在使用 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";
}

我的问题是,当抛出上述异常时,我进入构造函数(打印:“This prints...”)编辑:我还得到:“Mapper created!”

但是我的响应是空的,并且我没有通过我的 toResponse 方法访问 sys。这和球衣网站上的例子真的很相似:

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

我错过了什么??

【问题讨论】:

  • 你得到这个:“映射器创建”?也许您的映射器没有被正确识别。降低 jersey 的日志记录级别以查看正在扫描的类。
  • 是的,我得到了“创建的映射器”(已编辑,谢谢)
  • 结果是什么?根据您的代码,您应该得到空的 500 响应。
  • 如果使用 javax.ws.rs.core.Application 注册资源。您可以将 EntityExceptionMapper.class 添加到一组资源类型中。像这样的东西:classes.add(EntityExceptionMapper.class);
  • 我得到一个 204 没有内容(因为我的 toResponse 似乎从未被调用),在你的评论 Loc 之后,我尝试了一些已经注册的东西(看看它是否可以工作)我尝试扩展WebApplicationException,现在它可以工作了!我将考虑使用它作为我的异常类型或注册我自己的类型。我认为这将得到解决!非常感谢。

标签: java rest exception jersey provider


【解决方案1】:

我正在使用与部署无关的应用程序模型,因此以下对我有用:

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

【讨论】:

  • 非常感谢您节省了我的时间
【解决方案2】:

我遇到了类似的问题,ExceptionMapper 具有正确的 @Provider 注释,其余代码与 Jersey 的示例相同,但仍未正确注册。

事实证明,我必须使用方法addExceptionMapper 在我的HttpServlet 中手动注册我的自定义ExceptionMapper。因为现在是手动注册的,所以@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();

【讨论】:

    【解决方案3】:

    我在开发示例 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>
                <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.exceptionorg.manish.rest.message.exception

    之后我在邮递员中执行了一次,我得到了预期的结果。

    希望这可以解决您的问题。

    谢谢 马尼什

    【讨论】:

      【解决方案4】:

      我使用 spring 来连接 jersey 应用程序并将@Component 与@Provider 一起使用。

      当我迁移到 jersey v > 2.5 时,它停止了工作。

      我通过将@Singleton 注释而不是@Component 放在@Provider 旁边解决了这个问题,如下所示:

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

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题,并且能够通过在我的 web.xml 文件中的 jersey.config.server.provider.packages 中包含我的 ExceptionMapper 包来解决它。下面是我的 web.xml 中的一个 sn-p。

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

        【讨论】:

          【解决方案6】:

          尝试在 X extends ResourceConfig 文件中注册您的异常映射器类。 注册(CustomExceptionMapper.class); 此行将帮助应用程序找到您的映射器类并返回您在映射器类的 toResponse 方法中编写的任何内容

          【讨论】:

          【解决方案7】:

          我使用的是 Jersey 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);
          

          【讨论】:

            【解决方案8】:

            我仍在使用 jersey 1.17 、spring 和 jersy-spring

            @Component 注解解决了这个问题

            【讨论】:

              【解决方案9】:

              我遇到了同样的问题。我只需要修改 web.xml。 以前在我的 web.xml 文件中 param-value 是 com.two95.restful.resource 我刚改成root包com.two95.restful。然后它开始像魅力一样使用@Provider 注释。

              <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>com.two95.restful</param-value>
                  </init-param>
                  <load-on-startup>1</load-on-startup>
              </servlet>
              

              【讨论】:

                【解决方案10】:

                我也面临同样的问题。只需添加具有 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>
                

                这里,service 包含所有服务类,Utilities.ExceptionMapper 包含所有 exceptionMapper。 希望对您有所帮助

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-04-03
                  • 1970-01-01
                  • 2015-04-10
                  • 2012-11-29
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-05-27
                  相关资源
                  最近更新 更多