使用JAX-RS(Jersey)的HTTP状态错误消息响应中的自定义原因短语
在最近的一些工作中,我收到了在發生錯誤時在HTTP狀態響應中生成自定義“原因短語”的請求,該狀態短語傳遞給我們的一個REST API消耗客戶端。 在這篇文章中,我將演示如何使用Jersey來實現。
1.定義檢查的異常和異常映射器
正如您可能從我的文章使用Jersey的REST API中的錯誤處理中發現的那樣,我喜歡使用Jersey的ExceptionMapper功能來處理已檢查的異常 。
為了演示的目的,我定義了一個CustomReasonPhraseException :
CustomReasonPhraseException
和CustomReasonPhraseExceptionMapper來處理映射到一個響應,如果CustomReasonPhraseException發生:
CustomReasonPhraseExceptionMapper
package org.codingpedia.demo.rest.errorhandling;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 CustomReasonPhraseExceptionMapper implements ExceptionMapper<CustomReasonPhraseException> {public Response toResponse(CustomReasonPhraseException bex) {return Response.status(new CustomReasonPhraseExceptionStatusType(Status.BAD_REQUEST)).entity("Custom Reason Phrase exception occured : " + bex.getMessage()).build();}}提醒:當應用程序引發CustomReasonPhraseException ,將調用CustomReasonPhraseExceptionMapper實例的toResponse方法。
在ExceptionMapper代碼注釋第12行中:
CustomReasonPhraseExceptionStatusType
return Response.status(new CustomReasonPhraseExceptionStatusType(Status.BAD_REQUEST))在Jersey的ResponseBuilder您可以通過實現javax.ws.rs.core.Response.StatusType接口來定義自己的狀態類型。
2.實現自定義StatusType
為了使它更具擴展性,我創建了AbstractStatusType類:
AbstractStatusType
package org.codingpedia.demo.rest.errorhandling;import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.Response.Status.Family; import javax.ws.rs.core.Response.StatusType;/*** Class used to provide custom StatusTypes, especially for the the Reason Phrase that appears in the HTTP Status Response*/ public abstract class AbstractStatusType implements StatusType {public AbstractStatusType(final Family family, final int statusCode,final String reasonPhrase) {super();this.family = family;this.statusCode = statusCode;this.reasonPhrase = reasonPhrase;}protected AbstractStatusType(final Status status,final String reasonPhrase) {this(status.getFamily(), status.getStatusCode(), reasonPhrase);}@Overridepublic Family getFamily() { return family; }@Overridepublic String getReasonPhrase() { return reasonPhrase; }@Overridepublic int getStatusCode() { return statusCode; }private final Family family;private final int statusCode;private final String reasonPhrase;}之后,我使用CustomReasonPhraseExceptionStatusType進行擴展,以在響應中提供我想要的自定義Reason Phrase ( 例如“自定義錯誤消息” ):
CustomReasonPhraseExceptionStatusType擴展了AbstractStatusType
package org.codingpedia.demo.rest.errorhandling;import javax.ws.rs.core.Response.Status;/*** Implementation of StatusType for CustomReasonPhraseException.* The Reason Phrase is set in this case to "Custom error message"*/ public class CustomReasonPhraseExceptionStatusType extends AbstractStatusType{private static final String CUSTOM_EXCEPTION_REASON_PHRASE = "Custom error message";public CustomReasonPhraseExceptionStatusType(Status httpStatus) {super(httpStatus, CUSTOM_EXCEPTION_REASON_PHRASE);}}3.在HTTP狀態響應中測試自定義原因短語
請求
要求范例
GET http://localhost:8888/demo-rest-jersey-spring/mocked-custom-reason-phrase-exception HTTP/1.1 Accept-Encoding: gzip,deflate Host: localhost:8888 Connection: Keep-Alive User-Agent: Apache-HttpClient/4.1.1 (java 1.5)響應
瞧!
回應范例
HTTP/1.1 400 Custom error message Content-Type: text/plain Content-Length: 95 Server: Jetty(9.0.7.v20131107)Custom Reason Phrase exception occured : message attached to the Custom Reason Phrase Exception自定義“原因短語”將按預期方式出現在響應中。
提示:如果您真的想學習如何在Java中設計和實現REST API,請閱讀以下教程–借助Jersey和Spring在Java中進行REST API設計和實現
摘要
您已在本文中看到了要標記“特殊”錯誤時如何在HTTP狀態響應中創建自定義原因短語。 當然,您也可以使用此機制為其他HTTP狀態定義自己的“原因短語”。 實際上,您不應該濫用此原因短語功能,因為HTTP 1.1 rfc2616中的內容如下:
“ Status-Code元素是3位數的整數結果代碼,用于嘗試理解和滿足請求。 這些代碼在第10節中有完整定義。原因短語旨在簡要說明狀態代碼。 狀態碼供自動機使用,原因短語供人類用戶使用。 不需要客戶檢查或顯示原因短語?!?[1]
好吧,就是這樣。 繼續編碼并繼續共享編碼知識。
翻譯自: https://www.javacodegeeks.com/2014/10/custom-reason-phrase-in-http-status-error-message-response-with-jax-rs-jersey.html
總結
以上是生活随笔為你收集整理的使用JAX-RS(Jersey)的HTTP状态错误消息响应中的自定义原因短语的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米14渲染图曝光:行业内最窄边框 视觉
- 下一篇: 蔚来想通了一半