Java 未调用Jersey ExceptionMapper

Java 未调用Jersey ExceptionMapper,java,jersey,exceptionmapper,Java,Jersey,Exceptionmapper,我试图调用这个异常映射程序来返回404NotFound响应,但它一直返回500个内部错误。Jersey版本是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;

我试图调用这个异常映射程序来返回404NotFound响应,但它一直返回500个内部错误。Jersey版本是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();
    }
}
服务类抛出的方法

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

查看您的

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

请注意,这不是注释的问题。我看到有人评论说,由于@Provider注释未注册,如果您导入了正确的提供者,它将正常工作。请在下面找到我的解决方案

我在开发示例RESTAPI时遇到了同样的问题。在创建RESTAPI时,我给了基本包名,比如
org.manish.REST.message
,我想在基本包下每隔一个包创建一个,如下所示

 <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>org.manish.rest.message</param-value>
 </init-param>
  • model-
    org.manish.rest.message.model
  • 数据库-
    org.manish.rest.message.database
  • resource-
    org.manish.rest.message.resource
  • 在web.xml中,init参数是这样给出的

     <init-param>
                <param-name>jersey.config.server.provider.packages</param-name>
                <param-value>org.manish.rest.message</param-value>
     </init-param>
    
    
    jersey.config.server.provider.packages
    org.manish.rest.message
    
    这意味着,我已经在web.xml中注册了我的基本包,我将在此下创建什么包;将根据我的电话和要求考虑JAX-RS。但是当我错误地创建了我的异常包时,我把包名改为org.manish.rest.exception。因为这没有在web.xml中注册,所以JAX-RS不认为我的完整异常类处理异常。作为更正,我刚刚将我的异常包名称从
    org.manish.rest.exception
    修改为
    org.manish.rest.message.exception

    在那之后,我在《邮差》中执行了一次,并得到了预期的结果

    希望这能解决你的疑问


    谢谢Manish我想提出另一个选择。。。 更改映射程序包以匹配通常可以捕获异常的资源包

    假设资源类包为:

    package org.learn.rest.messengerdemo.resources;
    
    将映射器类包更改为:

    package org.learn.rest.messengerdemo.exception;
    
    致:

    这样,您就不会再处理框架生成的文件或不常见的语法

    我仍然不明白为什么不使用try/catch,但我正在重建我的Java知识,这样我就不会注入任何意见或请求。如果这是目前的做法,那么我很快就会知道。地图绘制者是一个有趣的机会

    package org.learn.rest.messengerdemo.exception;
    
    package org.learn.rest.messengerdemo.resources;