स्प्रिंग एमवीसी कंट्रोलर को जीईटी अनुरोध में डेट परमेस को कैसे स्वीकार करें?


122

मेरा एक GET अनुरोध है जो YYYY-MM-DD प्रारूप में एक स्प्रिंग नियंत्रक को एक तारीख भेजता है। नियंत्रक कोड इस प्रकार है:

@RequestMapping(value="/fetch" , method=RequestMethod.GET)
    public @ResponseBody String fetchResult(@RequestParam("from") Date fromDate) {
        //Content goes here
    }

अनुरोध सही ढंग से भेजा गया है क्योंकि मैं फायरबग के साथ जांच कर रहा हूं। मुझे त्रुटि मिलती है:

HTTP स्थिति 400: क्लाइंट द्वारा भेजा गया अनुरोध वाक्यविन्यास रूप से गलत था।

मैं दिनांक के इस प्रारूप को कैसे स्वीकार कर सकता हूं? कृपया मदद कीजिए। मैं क्या गलत कर रहा हूं?

जवाबों:


250

ठीक है, मैंने इसे हल किया। इसे किसी ऐसे व्यक्ति के लिए लिखना जो बिना रुके कोडिंग के पूरे दिन के बाद थक सकता है और ऐसी मूर्खतापूर्ण बात को याद कर सकता है।

@RequestMapping(value="/fetch" , method=RequestMethod.GET)
    public @ResponseBody String fetchResult(@RequestParam("from") @DateTimeFormat(pattern="yyyy-MM-dd") Date fromDate) {
        //Content goes here
    }

हाँ, यह सरल है। बस DateTimeFormat एनोटेशन जोड़ें।


18
मैं एक उत्तर लिखने जा रहा था लेकिन आपने मुझे हरा दिया। आप @DateTimeFormat (iso = ISO.DATE) का भी उपयोग कर सकते हैं, जो एक ही प्रारूप है। BTW, अगर आप मुझे सुझाव दे सकते हैं कि आप Joda DateTime लाइब्रेरी का उपयोग करें। स्प्रिंग वास्तव में अच्छी तरह से समर्थन करता है।
लुसियानो

जवाब आम तौर पर ठीक है, लेकिन! क्या स्प्रिंग को डिफ़ॉल्ट के रूप में कॉन्फ़िगर करने का कोई तरीका है? यह थोड़ा सा ओवरकिल है@DateTimeFormat आपके पास हर नियंत्रक में है ...
थोरिनकर

3
@ लुसियानो बेशक आप @DateTimeFormat (iso = ISO.DATE_TIME) भी कर सकते हैं
kiedysktos

2
@thorinkor स्प्रिंग बूट में आप spring.mvc.date-formatविशेषता को सेट कर सकते हैं application.propertiesया org.springframework.formatइंटरफ़ेस को लागू करने वाले बीन्स को जोड़ सकते हैं (विस्तार org.springframework.format.datetime.DateFormatterशायद जाने का तरीका है)। गैर बूट स्प्रिंग में आप कर सकते हैं की विधि और अपने फ़ॉर्मेटर-लागू करने वहाँ सेम जोड़ें। @OverrideaddFormattersWebMvcConfigurerAdapter
UTF_or_Death

10

यह वही है जो मैंने सामने के छोर से स्वरूपित तिथि प्राप्त करने के लिए किया था

  @RequestMapping(value = "/{dateString}", method = RequestMethod.GET)
  @ResponseBody
  public HttpStatus getSomething(@PathVariable @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) String dateString) {
   return OK;
  }

आप इसका उपयोग कर सकते हैं कि आप क्या चाहते हैं।


11
नहीं मिला। @ DateTimeFormat को @ PathVariable में जोड़ने का क्या मतलब है अगर आप तारीख को स्ट्रिंग के रूप में प्राप्त करते हैं, तारीख के रूप में नहीं?
ILya चक्रवात

7

... या आप इसे सही तरीके से कर सकते हैं और आपके आवेदन भर में तारीखों के क्रमांकन / विचलन के लिए एक सुसंगत नियम है। इसे एप्लिकेशन में रखें।

spring.mvc.date-format=yyyy-MM-dd

3

नीचे समाधान वसंत बूट आवेदन के लिए पूरी तरह से काम करता है।

नियंत्रक:

@GetMapping("user/getAllInactiveUsers")
List<User> getAllInactiveUsers(@RequestParam("date") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") Date dateTime) {
    return userRepository.getAllInactiveUsers(dateTime);
}

तो फोन करने वाले (मेरे मामले में एक वेब फ्लक्स) में, हमें इसमें ( "यय-एमएम-डीडी एचएच: मिमी: एसएस" तारीख का समय पास करना होगा ) प्रारूप ।

कॉलर साइड:

public Flux<UserDto> getAllInactiveUsers(String dateTime) {
    Flux<UserDto> userDto = RegistryDBService.getDbWebClient(dbServiceUrl).get()
            .uri("/user/getAllInactiveUsers?date={dateTime}", dateTime).retrieve()
            .bodyToFlux(User.class).map(UserDto::of);
    return userDto;
}

भंडार:

@Query("SELECT u from User u  where u.validLoginDate < ?1 AND u.invalidLoginDate < ?1 and u.status!='LOCKED'")
List<User> getAllInactiveUsers(Date dateTime);

चीयर्स !!


2

यदि आप एक PathVariable का उपयोग करना चाहते हैं, तो आप नीचे एक उदाहरण विधि का उपयोग कर सकते हैं (सभी विधियाँ और समान हैं):

//You can consume the path .../users/added-since1/2019-04-25
@GetMapping("/users/added-since1/{since}")
public String userAddedSince1(@PathVariable("since") @DateTimeFormat(pattern = "yyyy-MM-dd") Date since) {
    return "Date: " + since.toString(); //The output is "Date: Thu Apr 25 00:00:00 COT 2019"
}

//You can consume the path .../users/added-since2/2019-04-25
@RequestMapping("/users/added-since2/{since}")
public String userAddedSince2(@PathVariable("since") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date since) {
    return "Date: " + since.toString(); //The output is "Date: Wed Apr 24 19:00:00 COT 2019"
}

//You can consume the path .../users/added-since3/2019-04-25
@RequestMapping("/users/added-since3/{since}")
public String userAddedSince3(@PathVariable("since") @DateTimeFormat(pattern = "yyyy-MM-dd") Date since) {
    return "Date: " + since.toString(); //The output is "Date: Thu Apr 25 00:00:00 COT 2019"
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.