簡體   English   中英

Jersey ExceptionMapper 未被調用

[英]Jersey ExceptionMapper not being invoked

我正在嘗試調用此異常映射器以返回 404 not found 響應,但它一直返回 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();
    }
}

異常類。

包 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 ,您有這個

<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 參數中是這樣給出的

 <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.exceptionorg.manish.rest.message.exception

之后我在郵遞員中執行了一次,我得到了預期的結果。

希望這可以解決您的疑問。

謝謝曼尼什

我想提出另一個選項......更改映射器包以匹配通常可以捕獲異常的資源包。

假設資源類包是:

package org.learn.rest.messengerdemo.resources;

將映射器類包從:

package org.learn.rest.messengerdemo.exception;

到:

package org.learn.rest.messengerdemo.resources;

這樣你就不會擺弄框架生成的文件或不常見的語法。

我仍然不明白為什么不使用 try/catch 但我正在重建我的 Java 知識,所以我不會注入任何意見或請求任何意見。 如果它目前的做法,那么我很快就會學會。 映射器是一個有趣的機會。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM