Jersey ExceptionMapper未被调用

Ral*_*ang 5 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

例外类.

package org.learn.rest.messengerdemo.exception;

public class DataNotFoundException extends RuntimeException{

    private static final long serialVersionUID = 2176642539344388961L;

    public DataNotFoundException(String message)
    {
        super(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

服务类抛出的方法.

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

和资源类.

@GET
@Path("/{messageId}")
public Message getMessage(@PathParam("messageId") long messageId) {
    return messageService.getMessage(messageId);
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*tha 17

望着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>
Run Code Online (Sandbox Code Playgroud)

这个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>
Run Code Online (Sandbox Code Playgroud)