هل يمكن لـPathVariable إرجاع قيمة فارغة إذا لم يتم العثور عليها؟

StackOverflow https://stackoverflow.com/questions/5493767

سؤال

هل من الممكن أن تجعل @PathVariable لإرجاع قيمة فارغة إذا لم يكن متغير المسار موجودًا في عنوان url؟وإلا فأنا بحاجة إلى إنشاء معالجين.واحدة لأجل /simple وآخر ل /simple/{game}, ، لكن كلاهما يفعلان الشيء نفسه فقط إذا لم تكن هناك لعبة محددة، فإنني أختار أول لعبة من القائمة، ولكن إذا كانت هناك معلمة لعبة محددة، فأنا أستخدمها.

@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable("example") String example,
            HttpServletRequest request) {

وهذا ما أحصل عليه عند محاولة فتح الصفحة /simple:

حدث بسبب:java.lang.IllegalStateException:تعذر العثور على @PathVariable [مثال] في @RequestMapping

هل كانت مفيدة؟

المحلول

لا يمكن أن تكون اختيارية، لا.إذا كنت في حاجة إلى ذلك، فأنت بحاجة إلى طريقتين للتعامل معها.

يعكس هذا طبيعة متغيرات المسار - فليس من المنطقي حقًا أن تكون فارغة.تحتاج عناوين URL ذات نمط REST دائمًا إلى مسار URL الكامل.إذا كان لديك مكونًا اختياريًا، ففكر في جعله معلمة طلب بدلاً من ذلك (على سبيل المثال:استخدام @RequestParam).وهذا أكثر ملاءمة للوسائط الاختيارية.

نصائح أخرى

كما ذكر الآخرون بالفعل، لا، لا يمكنك أن تتوقع أن تكون فارغة عندما ذكرت معلمات المسار بشكل صريح.ومع ذلك يمكنك القيام بشيء مثل أدناه كحل بديل -

@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable Map<String, String> pathVariablesMap,
            HttpServletRequest request) {
    if (pathVariablesMap.containsKey("game")) {
        //corresponds to path "/simple/{game}"
    } else {
        //corresponds to path "/simple"
    }           
}

إذا كنت تستخدم Spring 4.1 وJava 8، فيمكنك استخدام java.util.Optional المدعوم في @RequestParam, @PathVariable, @RequestHeader و @MatrixVariable في الربيع MVC

@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable Optional<String> game,
            HttpServletRequest request) {
    if (game.isPresent()) {
        //game.get()
        //corresponds to path "/simple/{game}"
    } else {
        //corresponds to path "/simple"
    }           
}

يمكنك دائمًا القيام بذلك:

@RequestMapping(value = "/simple", method = RequestMethod.GET)
public ModelAndView gameHandler(HttpServletRequest request) {
    gameHandler2(null, request)
}

@RequestMapping(value = "/simple/{game}", method = RequestMethod.GET)
public ModelAndView gameHandler2(@PathVariable("game") String game,
        HttpServletRequest request) {
@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable(value="example",required = false) final String example)

جرب هذا الأسلوب، لقد نجح معي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top