input发送a.jax_Java REST JAX-RS 2.0 –如何处理日期,时间和时间戳记数据类型
input發(fā)送a.jax
無論是X-Form-Urlencoded還是JSON HTTP發(fā)布到REST資源端點,對于與日期或時間相關(guān)的數(shù)據(jù)都沒有特定的“數(shù)據(jù)類型”。 大多數(shù)開發(fā)人員會將這些數(shù)據(jù)發(fā)布為“字符串”,或者只是將它們轉(zhuǎn)換為Unix時間戳值(例如1435061152)。 但是,隨著開發(fā)人員實現(xiàn)越來越多的端點方法,將日期,時間和時間戳字符串表示值解析為實際java.sql.Date或java.util.Date的代碼將是重復(fù)的(并且很無聊)。 因此,本文旨在說明如何在JAX-RS 2.0 REST端點方法參數(shù)中實現(xiàn)用于處理日期和時間相關(guān)的字符串值的自定義數(shù)據(jù)類型。
兼容性
該代碼已通過Payara 4.1和Wildfly 8.2進行了測試。 對于其他其余的應(yīng)用程序服務(wù)器和servlet容器,需要JAX-RS 2.0庫/ Java EE 7兼容性才能運行。
樣品申請
為了演示這一點,讓我們構(gòu)建一個具有JAX-RS REST資源端點的示例應(yīng)用程序,該端點通過@FormParam參數(shù)值獲取自定義數(shù)據(jù)類型對象類,并將它們轉(zhuǎn)換為java.sql.Date , java.sql.Time , java。 sql.Timestamp和java.util.Date為方便起見。
HTTP POST請求示例
假設(shè)進行了以下URL的HTTP POST(使用“ SampleApplication ”作為應(yīng)用程序名稱,因此使用上下文):
http:// <主機名>:<端口> / SampleApplication / rest-api / request-handler / post-request-with-dates-and-time /
至于與此URL一起發(fā)布的HTTP參數(shù),它們是:
| 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 |
實現(xiàn)自定義數(shù)據(jù)類型類
解析日期字符串值并將其轉(zhuǎn)換為java.sql.Date
首先,讓我們編寫一個處理參數(shù)“ date_field ”的自定義數(shù)據(jù)類型類, 該類分析日期格式為yyyy-MM-dd的日期的字符串表示形式,并將其轉(zhuǎn)換為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定義適當?shù)娜掌诟袷?#xff0c;例如“ yyyy-MM-dd”,以解析日期字符串。 一旦構(gòu)造函數(shù)被調(diào)用并且在轉(zhuǎn)換之后,我們就可以通過getDate()方法獲取java.sql.Date對象。 除了java.sql.Date,您可能希望結(jié)果對象為java.util.Date或java.util.Calendar,這很好,這在很大程度上取決于應(yīng)用程序的具體情況。 在這里,由于我們沒有保留額外的時間和時區(qū)信息,因此只需一個簡單的java.sql.Date就足夠了。
對于下面的其他自定義數(shù)據(jù)類型類,則是如此。
解析時間字符串值(帶有AM / PM指示器)并將其轉(zhuǎn)換為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 "";}} }解析日期和時間字符串值并將其轉(zhuǎn)換為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 "";}} }解析時間字符串值(帶有時區(qū)數(shù)據(jù))并將其轉(zhuǎn)換為java.util.Date(帶有時區(qū)信息)
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資源端點
因此,在定義了必要的自定義數(shù)據(jù)類型類以定義各種日期和時間格式之后,就進行了定義。 REST資源端點方法現(xiàn)在將能夠使用這些類來封裝給定的各種數(shù)據(jù)格式。 所有要做的就是直接將其用作端點方法參數(shù)的數(shù)據(jù)類型。 例如:
// ... @POST @Path( "/path-root/path-value" ) public Response methodThatHandlesPostRequest(@FormParam( "date_field" ) RESTDateParam dateField ) {// The rest of the implementation... } // ...讓我們看一個完整的JAX-RS 2.0 REST資源端點實現(xiàn)示例。
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客戶端進行測試
為了測試自定義數(shù)據(jù)類型類,使用jQuery編寫了一個簡單HTML頁面,該頁面對端點URL執(zhí)行ajax HTTP POST。 只需將下面HTML文件打包為Web應(yīng)用程序的一部分,以將其一起部署以進行測試。 請將其部署到適當?shù)膽?yīng)用程序服務(wù)器或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>結(jié)果
單擊“ Submit ”按鈕后,HTML客戶端應(yīng)從REST資源端點方法(路徑:post-request-with-custom-param-data-type)接收正確的JSON響應(yīng),并顯示在屏幕。
發(fā)布結(jié)果
就這樣。 感謝您的閱讀,希望對您有所幫助。
翻譯自: https://www.javacodegeeks.com/2015/06/java-rest-jax-rs-2-0-how-to-handle-date-time-and-timestamp-data-types.html
input發(fā)送a.jax
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的input发送a.jax_Java REST JAX-RS 2.0 –如何处理日期,时间和时间戳记数据类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2k是什么意思 2k的意思是什么
- 下一篇: 什么是重金属离子 什么叫重金属离子