Java REST JAX-RS 2.0 –如何处理日期,时间和时间戳记数据类型
無論是X-Form-Urlencoded還是JSON HTTP發布到REST資源端點,對于與日期或時間相關的數據都沒有特定的“數據類型”。 大多數開發人員會將這些數據發布為“字符串”,或者只是將它們轉換為Unix時間戳值(例如1435061152)。 但是,隨著開發人員實現越來越多的端點方法,將日期,時間和時間戳字符串表示值解析為實際java.sql.Date或java.util.Date的代碼將是重復的(并且很無聊)。 因此,本文旨在說明如何在JAX-RS 2.0 REST端點方法參數中實現用于處理日期和時間相關的字符串值的自定義數據類型。
兼容性
該代碼已通過Payara 4.1和Wildfly 8.2進行了測試。 對于其他其余的應用程序服務器和Servlet容器,需要JAX-RS 2.0庫/ Java EE 7兼容性才能運行。
樣品申請
為了演示這一點,讓我們構建一個具有JAX-RS REST資源端點的示例應用程序,該端點通過@FormParam參數值獲取自定義數據類型對象類,并將它們轉換為java.sql.Date , java.sql.Time , java。 sql.Timestamp和java.util.Date為方便起見。
HTTP POST請求示例
假設進行了以下URL的HTTP POST(使用“ SampleApplication ”作為應用程序名稱,因此使用上下文):
http:// <主機名>:<端口> / SampleApplication / rest-api / request-handler / post-request-with-dates-and-time /
至于與此URL一起發布的HTTP參數,它們是:
| date_field | 1948-05-15 | yyyy-MM-dd | RESTDateParam |
| time_field | 下午3:23 | h:mma | RESTTimeParam |
| timestamp_field | 1979-10-11T14:45:00 | yyyy-MM-dd'T'HH:mm:ss | RESTTimestampParam |
| timestamp_with_tzd_field | 1979-10-11T14:45:00 + 0800 | yyyy-MM-dd'T'HH:mm:ssZ | RESTTimestampWithTZDParam |
實現自定義數據類型類
解析日期字符串值并將其轉換為java.sql.Date
首先,讓我們編寫一個處理參數“ date_field ”的自定義數據類型類, 該類分析日期格式為yyyy-MM-dd的日期的字符串表示形式,并將其轉換為java.sql.Date 。
RESTDateParam.java的代碼
package com.developerscrappad;import java.text.ParseException; import java.text.SimpleDateFormat; import javax.ws.rs.WebApplicationException;public class RESTDateParam {// Declare the date format for the parsing to be correctprivate static final SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd" );private java.sql.Date date;/*** This is the default constructor which must take in one string parameter.* The parameter is no other than the one passed in through the REST* end-point. We'll see it later...*/public RESTDateParam( String dateStr ) throws WebApplicationException {try {date = new java.sql.Date( df.parse( dateStr ).getTime() );} catch ( final ParseException ex ) {// Wrap up any expection as javax.ws.rs.WebApplicationExceptionthrow new WebApplicationException( ex );}}/*** This is a getter method which returns the parsed date string value as* java.sql.Date**/public java.sql.Date getDate() {return date;}/*** For convenience of result checking*/@Overridepublic String toString() {if ( date != null ) {return date.toString();} else {return "";}} }代碼說明
在這里,我們首先為SimpleDateFormat定義適當的日期格式,例如“ yyyy-MM-dd”,以解析日期字符串。 調用構造函數后,在轉換之后,我們就可以通過getDate()方法獲取java.sql.Date對象。 除了java.sql.Date,您可能希望結果對象為java.util.Date或java.util.Calendar,這很好,這在很大程度上取決于應用程序的具體情況。 在這里,由于我們沒有保留額外的時間和時區信息,因此只需一個簡單的java.sql.Date就足夠了。
對于下面其余的自定義數據類型類,則是如此。
解析時間字符串值(帶有AM / PM指示器)并將其轉換為java.sql.Time
RESTTimeParam.java的代碼
package com.developerscrappad;import java.text.ParseException; import java.text.SimpleDateFormat; import javax.ws.rs.WebApplicationException;public class RESTTimeParam {private static final SimpleDateFormat df = new SimpleDateFormat( "h:mma" );private java.sql.Time time;public RESTTimeParam( String timeStr ) throws WebApplicationException {try {time = new java.sql.Time( df.parse( timeStr ).getTime() );} catch ( final ParseException ex ) {throw new WebApplicationException( ex );}}public java.sql.Time getTime() {return time;}@Overridepublic String toString() {if ( time != null ) {return time.toString();} else {return "";}} }解析日期和時間字符串值并將其轉換為java.sql.Timestamp
RESTTimestampParam.java的代碼
package com.developerscrappad;import java.text.ParseException; import java.text.SimpleDateFormat; import javax.ws.rs.WebApplicationException;public class RESTTimestampParam {private static final SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss" );private java.sql.Timestamp timestamp;public RESTTimestampParam( String timestampStr ) throws WebApplicationException {try {timestamp = new java.sql.Timestamp( df.parse( timestampStr ).getTime() );} catch ( final ParseException ex ) {throw new WebApplicationException( ex );}}public java.sql.Timestamp getTimestamp() {return timestamp;}@Overridepublic String toString() {if ( timestamp != null ) {return timestamp.toString();} else {return "";}} }解析時間字符串值(帶有時區數據)并將其轉換為java.util.Date(帶有時區信息)
RESTTimestampWithTZDParam.java的代碼
package com.developerscrappad;import java.text.ParseException; import java.text.SimpleDateFormat; import javax.ws.rs.WebApplicationException;public class RESTTimestampWithTZDParam {private static final SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ssZ" );private java.util.Date date;public RESTTimestampWithTZDParam( String dateTimeStr ) throws WebApplicationException {try {date = new java.util.Date( df.parse( dateTimeStr ).getTime() );} catch ( final ParseException ex ) {throw new WebApplicationException( ex );}}public java.util.Date getDate() {return date;}@Overridepublic String toString() {if ( date != null ) {return date.toString();} else {return "";}} }實施REST資源端點
因此,在定義了必要的自定義數據類型類以定義各種日期和時間格式之后,就進行了定義。 REST資源端點方法現在將能夠使用這些類來封裝給定的各種數據格式。 所有要做的就是直接將其用作端點方法參數的數據類型。 例如:
// ... @POST @Path( "/path-root/path-value" ) public Response methodThatHandlesPostRequest(@FormParam( "date_field" ) RESTDateParam dateField ) {// The rest of the implementation... } // ...讓我們看一個完整的JAX-RS 2.0 REST資源端點實現示例。
RESTResource.java的代碼
package com.developerscrappad;import javax.json.Json; import javax.ws.rs.FormParam; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.CacheControl; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder;@Path( "request-handler" ) public class RESTResource {@POST@Path( "post-request-with-custom-param-data-type" )@Produces( "application/json" )public Response postRequestWithCustomParamDataType(@FormParam( "date_field" ) RESTDateParam dateField, // Put the custom data type to good use@FormParam( "time_field" ) RESTTimeParam timeField,@FormParam( "timestamp_field" ) RESTTimestampParam timestampField,@FormParam( "timestamp_with_tzd_field" ) RESTTimestampWithTZDParam tsWithTZDField) {// Output these data as JSON as server responseString jsonResult = Json.createObjectBuilder().add( "data_submitted", Json.createObjectBuilder().add( "date_field", dateField.toString() ).add( "time_field", timeField.toString() ).add( "timestamp_field", timestampField.toString() ).add( "timestamp_with_tzd_field", tsWithTZDField.toString() )).build().toString();return getNoCacheResponseBuilder( Response.Status.OK ).entity( jsonResult ).build();}/*** Say NO to result caching*/protected ResponseBuilder getNoCacheResponseBuilder( Response.Status status ) {CacheControl cc = new CacheControl();cc.setNoCache( true );cc.setMaxAge( -1 );cc.setMustRevalidate( true );return Response.status( status ).cacheControl( cc );} }不要忘記擴展javax.ws.rs.core.Application的啟動REST Application類。
RESTApplication的代碼
package com.developerscrappad;import java.util.Arrays; import java.util.HashSet; import java.util.Set; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application;@ApplicationPath( "rest-api" ) public class RESTApplication extends Application {public Set<Class<?>> getClasses() {return new HashSet<Class<?>>( Arrays.asList( RESTResource.class ) );} }使用jQuery Ajax POST通過HTML客戶端進行測試
為了測試自定義數據類型類,使用jQuery編寫了一個簡單HTML頁面,該頁面對端點URL執行ajax HTTP POST。 只需將下面HTML文件打包為Web應用程序的一部分,以將其一起部署以進行測試。 請將其部署到適當的應用程序服務器或servlet容器中。
post-with-custom-param-data-type.html的代碼
<!DOCTYPE html> <html><head><title>Date, Time and Timestamp HTTP Post</title></head><body><div>Date Field: <input id="dateField" type="text" value="1948-05-15" /> (format must be 'yyyy-MM-dd')</div><div>Time Field: <input id="timeField" type="text" value="3:23PM" /> (format must be 'h:mma')</div><div>Timestamp Field: <input id="timestampField" type="text" value="1979-10-11T14:45:00" style="width: 200px;" /> (format must be 'yyyy-MM-ddTHH:mm:ss')</div><div>Timestamp With Time Zone Field: <input id="timestampWithTZDField" type="text" value="1979-10-11T14:45:00+0800" style="width: 200px;" /> (format must be 'yyyy-MM-ddTHH:mm:ss+/-HHmm')</div><div><input type="button" value="Submit" onclick="javascript:performSubmit();" /></div><br /><br /><div id="resultJson"></div><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script><script type="text/javascript">var $ = jQuery.noConflict();function performSubmit() {$.ajax( {url: "rest-api/request-handler/post-request-with-custom-param-data-type",type: "POST",data: {"date_field": $.trim( $( "#dateField" ).val() ),"time_field": $.trim( $( "#timeField" ).val() ),"timestamp_field": $.trim( $( "#timestampField" ).val() ),"timestamp_with_tzd_field": $.trim( $( "#timestampWithTZDField" ).val( ) )},success: function ( resultObj, textStatus, xhr ) {$( "#resultJson" ).html( "<h2>Post Result (JSON)</h2>" + JSON.stringify( resultObj ) );},error: function ( xhr, textStatus, errorThrown ) {$( "#resultJson" ).html( "Something went wrong, status " + xhr.status );}} );}</script></body> </html>結果
單擊“ Submit ”按鈕后,HTML客戶端應從REST資源端點方法(路徑:post-request-with-custom-param-data-type)接收正確的JSON響應,并顯示在屏幕。
發布結果
就這樣。 感謝您的閱讀,希望對您有所幫助。
翻譯自: https://www.javacodegeeks.com/2015/06/java-rest-jax-rs-2-0-how-to-handle-date-time-and-timestamp-data-types.html
總結
以上是生活随笔為你收集整理的Java REST JAX-RS 2.0 –如何处理日期,时间和时间戳记数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 龙芯3A5000LL与i7-10700的
- 下一篇: 集采报告丨国家药品带量采购政策及趋势分析