क्या मुझे JAX-RS @PathParam में दिनांक प्रकार का उपयोग करना चाहिए?


9

यह मैं एक जेईई ग्लासफिश सर्वर पर जर्सी का उपयोग करने के बारे में सोच रहा हूं।

@GET
@Path("/{name}/{date}")
public String getMessages(@PathParam("name") String name, @PathParam("date") Date date)

मुझे इस Restful webservice का उपभोग करने वाले लोगों को यह बताने में सक्षम होने का विचार पसंद है कि "तारीख यहाँ कुछ भी है जो जावा में दिनांक वर्ग के साथ काम करती है"। यह दृष्टिकोण से बहुत सरल है कि वे केवल दिनांक कल्पना को देख सकते हैं, और उनके पास पहले से ही एक कार्यशील मॉडल होगा जिसे वे परीक्षण कर सकते हैं।

मैं जिस समस्या को लेकर चिंतित हूं, वह यह है कि जब मैं ऐसा करता हूं, तो JAX-RS बहुत अच्छा नहीं होता है जब दिनांक () को यह पसंद नहीं है कि यह कंस्ट्रक्टर में क्या मिलता है। चूंकि दिनांक () एक त्रुटि फेंकता है यदि यह पार्स नहीं कर सकता है कि यह क्या दिया है (जैसे कि यदि आप इसे "आज की तारीख के बजाय" आज "स्ट्रिंग) पास करते हैं, तो जेईई सर्वर 404 त्रुटि देता है।

क्या यह अच्छा अभ्यास है? क्या ऐसा करने का एक बेहतर तरीका है जो मैं नहीं सोच रहा हूं?

जवाबों:


8

एक बुरे विचार की तरह लगता है। एक बात के लिए, दिनांक निर्माणकर्ता जिस पर आप भरोसा कर रहे हैं, वह दिनांक 1.1 से DateFormat.parseDate () के पक्ष में हटा दिया गया है, ठीक है क्योंकि यह स्पष्ट नहीं है कि स्ट्रिंग को तारीखों में कैसे पार्स किया जाना चाहिए, क्योंकि विभिन्न इलाकों के लिए नियम अलग हैं।

मेरी सिफारिश एक विशिष्ट प्रारूप के साथ रहना होगा, अधिमानतः अंतरराष्ट्रीय स्तर पर समझी जाने वाली yyyy-MM-dd, और अपनी सेवा के अंदर स्ट्रिंग से दिनांक को पार्स करने के लिए एक DateFormat का उपयोग करें, जो यह स्पष्ट करता है कि वेब सेवा का उपभोग कैसे करें, और आपको अनुमति देता है जब कुछ गलत हो जाता है, तो त्रुटि संदेशों को वापस करने के लिए जो भी मानक सम्मेलन होता है, उसका पालन करें।


11

मैं एक कस्टम वर्ग का उपयोग कर रहा हूँ DateParam:

@GET
@Path("/{name}/{date}")
public String getMessages(@PathParam("name") String name, @PathParam("date") DateParam date)
  Date date = date.getDate();

वर्ग के रूप में परिभाषित किया गया है:

public class DateParam {
  private final Date date;

  public DateParam(String dateStr) throws WebApplicationException {
    if (isEmpty(dateStr)) {
      this.date = null;
      return;
    }
    final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    try {
      this.date = dateFormat.parse(dateStr);
    } catch (ParseException e) {
      throw new WebApplicationException(Response.status(Status.BAD_REQUEST)
        .entity("Couldn't parse date string: " + e.getMessage())
        .build());
    }
  }

  public Date getDate() {
    return date;
  }
}

यदि पैरामीटर खाली है, तो आपको एक अशक्त तिथि मिलेगी। आप DateParamअपरिभाषित दिनांक मानों के लिए सार्वजनिक स्थैतिक अंतिम फ़ील्ड द्वारा विस्तार कर सकते हैं । यह अपरिभाषित तारीख के लिए परीक्षण को स्पष्ट कर देगा।

यहाँ एक कमी यह है कि प्रत्येक DateParam के लिए, SimpleDateFormat का एक नया उदाहरण बनाया जाता है। हालाँकि, SimpleDateFormat थ्रेड-सुरक्षित नहीं है, हम इसे आसानी से पुन: उपयोग नहीं कर सकते।


3
1 +। Java 8 ने एक थ्रेड को सुरक्षित किया DateTimeFormatter। जावा <= 7 के लिए, मैं ThreadLocal
बजे

3

आपकी सेवा का उपयोग कौन करेगा? क्या वे Dateकक्षा के विनिर्देश को देखने के लिए परेशान होंगे और यह पता लगाएंगे कि यह किस प्रकार के तार को पार्स करेगा? मैं जावा प्रोग्रामर होने के बावजूद भी नहीं जानता कि मुझे कहाँ देखना है ;-)

मुझे लगता है कि आपको सबसे पहले अपने यूजर्स को बताना चाहिए कि आपका यूआरआई कैसा दिखेगा, जैसे

.../your-resource-name/yyyy-MM-dd

और फिर जर्सी को चुनने का एक तरीका खोज लें कि आपने जो भी तारीख प्रारूप चुना है, उसे पार्स करने में आपकी मदद करेगा। इसका मतलब हो सकता है कि एक Dateपैरामीटर प्रकार का उपयोग करना और शायद आपके @Pathएनोटेशन में एक नियमित अभिव्यक्ति को निर्दिष्ट करना , जैसे

@Path(/{name}/{date: [0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]/)

या आपके प्रारूप में किसी तिथि को पार्स करने में सक्षम कुछ अन्य वर्ग का उपयोग करना। यूआरआई को कैसे संभालना है जो आपके उपयोगकर्ताओं को दिए गए चश्मे से मेल नहीं खाता है, फिर भी एक और बात यह है कि आपको यह तय करना चाहिए कि उपरोक्त में से किसी से स्वतंत्र रूप से कैसे निपटें (डिफ़ॉल्ट संसाधन लौटाएं? 404 त्रुटि लौटाएं?)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.