বসন্তের সাথে আমি কী একটি pathচ্ছিক পথ পরিবর্তনশীল করতে পারি?


186

স্প্রিং 3.0.০ সহ, আমি কী একটি pathচ্ছিক পথ চলক পেতে পারি?

উদাহরণ স্বরূপ

@RequestMapping(value = "/json/{type}", method = RequestMethod.GET)
public @ResponseBody TestBean testAjax(
        HttpServletRequest req,
        @PathVariable String type,
        @RequestParam("track") String track) {
    return new TestBean();
}

এখানে আমি একই পদ্ধতিটি পছন্দ করতে /json/abcবা /jsonকল করতে চাই ।
একটি স্পষ্টতই কাজের typeঅনুরোধটি একটি অনুরোধের প্যারামিটার হিসাবে ঘোষণা করুন :

@RequestMapping(value = "/json", method = RequestMethod.GET)
public @ResponseBody TestBean testAjax(
        HttpServletRequest req,
        @RequestParam(value = "type", required = false) String type,
        @RequestParam("track") String track) {
    return new TestBean();
}

এবং তারপরে /json?type=abc&track=aaবা /json?track=rrকাজ করবে

উত্তর:


194

আপনার pathচ্ছিক পাথ ভেরিয়েবলগুলি থাকতে পারে না তবে আপনার দুটি নিয়ামক পদ্ধতি থাকতে পারে যা একই পরিষেবা কোডটিকে কল করে:

@RequestMapping(value = "/json/{type}", method = RequestMethod.GET)
public @ResponseBody TestBean typedTestBean(
        HttpServletRequest req,
        @PathVariable String type,
        @RequestParam("track") String track) {
    return getTestBean(type);
}

@RequestMapping(value = "/json", method = RequestMethod.GET)
public @ResponseBody TestBean testBean(
        HttpServletRequest req,
        @RequestParam("track") String track) {
    return getTestBean();
}

5
@ শামিক: আমার মতে পাথের ভেরিয়েবলগুলি ব্যবহার না করা এটি একটি বাধ্যতামূলক কারণ । মিশ্রিত বিস্তার দ্রুত হাত থেকে বেরিয়ে যেতে পারে।
স্কাফম্যান

9
প্রকৃতপক্ষে নয় কারণ alচ্ছিক উপাদানগুলি পূরণ করার সময় পথটি জটিল হতে পারে না। আপনার যদি এক বা একাধিক দুটি alচ্ছিক পাথ উপাদান থাকে তবে প্যারামিটারের জন্য অনুরোধ করার জন্য তাদের কয়েকটি পরিবর্তন করার বিষয়ে গুরুত্ব সহকারে বিবেচনা করা উচিত।
প্যাট্রিক কর্নেলিসসেন

1
এবং কিছু লোকের জন্য, দ্বিতীয় কন্ট্রোলার পদ্ধতিটি প্রথম নিয়ন্ত্রণকারী পদ্ধতি কল
করতেও কাজ

3
পরিবর্তে বসন্তের নতুন সংস্করণ দুটি নিয়ামক পদ্ধতি তৈরি আমরা শুধু ব্যবহার করতে পারে, আপনার উত্তর আপডেট বিবেচনা করুন @RequestMapping: এ দুটি মান stackoverflow.com/questions/17821731/...
csharpfolk

ওগো আপনি কীভাবে এই শেষবিন্দুগুলি বজায় রাখবেন? এবং যদি আমাদের কেবল একটি পাথ ভেরিয়েবলের পরিবর্তে 5 থাকে তবে আমার জন্য গণিতটি কি, আপনি কতটি শেষ পয়েন্ট করবেন? দয়া করে আমাকে অনুগ্রহ করুন এবং প্রতিস্থাপন @PathVariableকরুন@RequestParam
গিলহেরেম আলেঙ্কার

113

আপনি Spring 4.1 এবং জাভা 8 ব্যবহার করেন তাহলে আপনি ব্যবহার করতে পারেন java.util.Optionalযা সমর্থিত মধ্যে @RequestParam, @PathVariable, @RequestHeaderএবং @MatrixVariableস্প্রিং MVC মধ্যে -

@RequestMapping(value = {"/json/{type}", "/json" }, method = RequestMethod.GET)
public @ResponseBody TestBean typedTestBean(
    @PathVariable Optional<String> type,
    @RequestParam("track") String track) {      
    if (type.isPresent()) {
        //type.get() will return type value
        //corresponds to path "/json/{type}"
    } else {
        //corresponds to path "/json"
    }       
}

আপনি কি নিশ্চিত যে এটি কাজ করবে? আপনার নিজের উত্তর এখানে পরামর্শ দেয় যে {টাইপ} পথ থেকে অনুপস্থিত থাকলে নিয়ামককে আঘাত করা হবে না। আমি মনে করি পাথ ভেরিয়েবল মানচিত্রটি আরও ভাল পদ্ধতির হতে পারে, বা পৃথক নিয়ামক ব্যবহার করে।
আনশুল তিওয়ারি

4
হ্যাঁ আপনার যদি সবেমাত্র থাকে "/json/{type}"এবং টাইপটি উপস্থিত না থাকে তবে এটি হিট হবে না (আমার লিঙ্কযুক্ত উত্তর অনুসারে) তবে এখানে আপনার রয়েছে value = {"/json/{type}", "/json" }। সুতরাং যে কোনও একটি ম্যাচ নিয়ন্ত্রণকারী পদ্ধতি হিট হবে।
অনিকেত ঠাকুর

এটা কি একই মান ইত্যাদি প্রকারে অনুরোধপাড়াম এবং অনুরোধপাড়ম হতে পারে?
zygimantus

এটি কাজ করে, তবে যাইহোক নিয়ন্ত্রণকের ফাংশন বলা হবে না কারণ এটি সেখানে প্যারামিটারের প্রত্যাশা করে
এলিউএক্স

15
এটি কাজ করে এবং স্প্রিং ৪.৩.৩ থেকে আপনি @PathVariable(required = false)চলক উপস্থিত না থাকলে আপনিও সাথে যেতে পারেন এবং নাল পেতে পারেন।
নিকোলাই এহমান

76

এটি জানা যায় না যে আপনি @PATVariable টীকাটি ব্যবহার করে পাথ ভেরিয়েবলের মানচিত্রও ইনজেক্ট করতে পারেন। আমি নিশ্চিত নই যে এই বৈশিষ্ট্যটি স্প্রিং 3.0.০ এ পাওয়া যায় বা এটি পরে যুক্ত করা হয়েছিল তবে উদাহরণটি সমাধানের আরও একটি উপায় এখানে রয়েছে:

@RequestMapping(value={ "/json/{type}", "/json" }, method=RequestMethod.GET)
public @ResponseBody TestBean typedTestBean(
    @PathVariable Map<String, String> pathVariables,
    @RequestParam("track") String track) {

    if (pathVariables.containsKey("type")) {
        return new TestBean(pathVariables.get("type"));
    } else {
        return new TestBean();
    }
}

1
আমি এটি সর্বদা ব্যবহার করি .যখন বিভিন্ন ইউরি প্রকারগুলি হ্যান্ডেল করার জন্য আমি একটি একক পদ্ধতি চাই his "/ জেএসন / {টাইপ}", "/ জেএসন / {টাইপ} / {xyz}", "/ জেএসন / {টাইপ} / {এবিসি} "," / জেএসন / {টাইপ} / {অ্যাবসি} / {কিছু} "," /
জসন

25

আপনি এটি ব্যবহার করতে পারেন:

@RequestParam(value="somvalue",required=false)

একটি পথ পরিবর্তনযোগ্য পরিবর্তে forচ্ছিক প্যারামের জন্য


1
এটি সংস্করণ নির্দিষ্ট, মনে হয়। স্প্রিং 3-তে যান না
স্টু থম্পসন

5
বর্তমানে একটি বসন্ত ৩.১ প্রকল্পের জন্য এই পদ্ধতিটি ব্যবহার করছে এবং ডক্স বলছে যে এটি 2.5+ এর জন্য কাজ করে, তাই এটি স্প্রিং 3 এর জন্য অবশ্যই কাজ করে E সম্পাদনা: উত্স
ইভান বি।

22
সত্য, তবে এটি প্রশ্নটি সম্পর্কে নয়। অনুরোধের প্যারামিটারগুলি ব্যবহার করা প্রশ্নটিতে প্রকৃতপক্ষে "ওয়ান সুস্পষ্ট workaround" হিসাবে উল্লেখ করা হয়েছে , তবে প্রশ্ন নিজেই পথের পরামিতি সম্পর্কে । এটি বিকল্প পথের পরামিতিগুলির জন্য কোনও সমাধান নয়।
আরজান

9
পাথ ভেরিয়েবল এবং রিকোয়েস্টপরাম আলাদা।
নিরবধি

9

স্প্রিং 5 / স্প্রিং বুট 2 উদাহরণ:

ব্লক করা

@GetMapping({"/dto-blocking/{type}", "/dto-blocking"})
public ResponseEntity<Dto> getDtoBlocking(
        @PathVariable(name = "type", required = false) String type) {
    if (StringUtils.isEmpty(type)) {
        type = "default";
    }
    return ResponseEntity.ok().body(dtoBlockingRepo.findByType(type));
}

প্রতিক্রিয়াশীল

@GetMapping({"/dto-reactive/{type}", "/dto-reactive"})
public Mono<ResponseEntity<Dto>> getDtoReactive(
        @PathVariable(name = "type", required = false) String type) {
    if (StringUtils.isEmpty(type)) {
        type = "default";
    }
    return dtoReactiveRepo.findByType(type).map(dto -> ResponseEntity.ok().body(dto));
}

5

নিকোলাই এহমানের মন্তব্য এবং ওয়াইল্ডলুপের উত্তরের সরলীকৃত উদাহরণ (স্প্রিং 4.3.3+ এর সাথে কাজ করে), মূলত আপনি required = falseএখন ব্যবহার করতে পারেন :

  @RequestMapping(value = {"/json/{type}", "/json" }, method = RequestMethod.GET)
  public @ResponseBody TestBean testAjax(@PathVariable(required = false) String type) {
    if (type != null) {
      // ...
    }
    return new TestBean();
  }

3

এই চেক করুন স্প্রিং 3 WebMVC - ঐচ্ছিক পথ ভেরিয়েবল । এটি Antচ্ছিক পথের ভেরিয়েবলগুলি সক্ষম করতে অ্যান্টপ্যাথম্যাচারকে একটি এক্সটেনশন করার একটি নিবন্ধ দেখায় এবং সম্ভবত এটি সহায়ক হতে পারে। নিবন্ধটি পোস্ট করার জন্য সমস্ত ক্রেডিট সেবাস্তিয়ান হেরল্ডকে


-5
$.ajax({
            type : 'GET',
            url : '${pageContext.request.contextPath}/order/lastOrder',
            data : {partyId : partyId, orderId :orderId},
            success : function(data, textStatus, jqXHR) });

@RequestMapping(value = "/lastOrder", method=RequestMethod.GET)
public @ResponseBody OrderBean lastOrderDetail(@RequestParam(value="partyId") Long partyId,@RequestParam(value="orderId",required=false) Long orderId,Model m ) {}

3
আপনি কেন নিজের উত্তরে (4 বছর পরে) সমস্যাটি সমাধানে অবদান রাখছেন বলে মনে করছেন তা ব্যাখ্যা করে আপনি নিজের উত্তরে কিছু পাঠ্যে সম্পাদনা করতে চাইতে পারেন ।
কুরেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.