![](/img/trans.png)
[英]toResponse in jersey ExceptionMapper does not get invoked
[英]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
,我應該像這樣在基本包下創建所有其他包
org.manish.rest.message.model
org.manish.rest.message.database
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.exception
為org.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.