【问题标题】:Jersey ExceptionMapper not being invokedJersey ExceptionMapper 未被调用
【发布时间】:2015-10-28 08:35:27
【问题描述】:

我正在尝试调用此异常映射器以返回 404 未找到响应,但它一直返回 500 内部错误。泽西版本是 2.22.1。下面是代码 sn-p。感谢所有帮助。

谢谢。

异常映射器类。

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

异常类。

包 org.learn.rest.messengerdemo.exception;

public class DataNotFoundException extends RuntimeException{

    private static final long serialVersionUID = 2176642539344388961L;

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

服务类的抛出方法。

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

还有资源类。

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

【问题讨论】:

    标签: java jersey exceptionmapper


    【解决方案1】:

    从你的previous questionweb.xml,你有这个

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

    这个 init-parm jersey.config.server.provider.packages 说的是,Jersey 应该扫描命名包以查找 @Path 带注释的资源类和 @Provider 带注释的提供程序类并注册它们。

    您只列出了资源包org.learn.rest.messengerdemo.resources,但您ExceptionMapper 位于不同的包中。默认行为是递归扫描,也意味着子包。因此,如果您改为列出org.learn.rest.messengerdemo,您将同时点击资源包异常包。或者您可以列出两个包,用逗号或分号分隔。无论哪种方式都可以

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

    【讨论】:

      【解决方案2】:

      请注意,这不是注释问题。我见过有人给 cmets ,由于 @Provider 注释它没有注册,如果你导入了正确的提供者,它会起作用。请在下面找到我的解决方案

      我在开发示例 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.exception 修改为 org.manish.rest.message.exception

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

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

      感谢马尼什

      【讨论】:

        【解决方案3】:

        我想提出另一种选择... 更改映射器包以匹配通常可以捕获异常的资源包。

        假设资源类包是:

        package org.learn.rest.messengerdemo.resources;
        

        从以下位置更改映射器类包:

        package org.learn.rest.messengerdemo.exception;
        

        到:

        package org.learn.rest.messengerdemo.resources;
        

        这样您就不会摆弄框架生成的文件或不常见的语法。

        我仍然不明白为什么不使用 try/catch,但我正在重建我的 Java 知识,所以我不会提出意见或要求任何意见。如果它目前的做法,那么我会很快学会的。映射器是一个有趣的机会。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-18
          • 1970-01-01
          • 2014-01-24
          • 1970-01-01
          • 2015-03-19
          • 2015-03-14
          • 2017-01-01
          • 1970-01-01
          相关资源
          最近更新 更多