Jersey ExceptionMapper未被调用

时人不识凌云木,直待凌云始道高。这篇文章主要讲述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 implementsExceptionMapper< 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); }

答案看看你的web.xml的previous question,你有这个
< 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>

另一答案请注意,这不是注释问题。我见过人们给出的评论由于@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是这样给出的
< 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 post执行了一次,我得到了预期的结果。
希望这可以解决您的疑问。
谢谢Manish
另一答案我想提出另一种选择...更改映射器包以匹配通常可以捕获异常的资源包。
假设资源类包是:
package org.learn.rest.messengerdemo.resources;

从以下位置更改映射器类包:
package org.learn.rest.messengerdemo.exception;

至:
package org.learn.rest.messengerdemo.resources;

这样你就不会摆弄框架生成的文件或不常见的语法。
【Jersey ExceptionMapper未被调用】我仍然不明白为什么没有使用try / catch但我正在重建我的Java知识,所以我不会注入任何意见或请求。如果它目前的做法,那么我很快就会学到这一点。而映射器是一个有趣的机会。

    推荐阅读