Jersey ExceptionMapper未被调用

时间:2015-10-28 08:35:28

标签: java jersey exceptionmapper

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

感谢。

异常映射器类。

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

异常类。

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

3 个答案:

答案 0 :(得分:17)

查看previous question中的web.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说的是泽西岛应该扫描命名包中@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>

答案 1 :(得分:1)

请注意,这不是注释问题。我见过人们给出的评论由于@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
  4. 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

    之后我在帖子中执行了一次,我得到了预期的结果。

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

    谢谢Manish

答案 2 :(得分:0)

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

假设资源类包是:

package org.learn.rest.messengerdemo.resources;

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

package org.learn.rest.messengerdemo.exception;

为:

package org.learn.rest.messengerdemo.resources;

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

我仍然没有理解为什么没有使用try / catch但是我重建了我的Java知识,所以我不会注入任何意见或请求。如果它目前的做法,那么我很快就会学到这一点。而映射器就是一个有趣的机会。