খালি রিকোয়েস্টপ্যারাম মানগুলি ডিফল্টভ্যালু ব্যবহার করা কি সম্ভব?


120

যদি আমার কাছে এএ অনুরোধ ম্যাপিং থাকে তবে নীচের মতো:

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", defaultValue = "10") int i) {
}

এবং তারপরে এই অনুরোধটি কল করুন:

http://example.com/test?i=

আমি ত্রুটি বার্তা পেয়েছি

'Java.lang.string' টাইপের মান 'টাইপ' তে রূপান্তর করতে ব্যর্থ; নেস্টেড ব্যতিক্রম java.lang.Number FormatException: ইনপুট স্ট্রিংয়ের জন্য: "" '

আমি জাভাস্ক্রিপ্ট ক্লায়েন্টকে খালি প্যারামিটারগুলি পাঠানো বন্ধ করে দিয়ে বা স্ট্রিংয়ের মানগুলি গ্রহণ করে এবং যদি ফাঁকা পাওয়া যায় না তবে কেবল বিশ্লেষণ করে এটি সমাধান করতে পারি।

আপডেট : বসন্তের পরবর্তী সংস্করণগুলি এখন আসল পছন্দসই আচরণটি প্রয়োগ করে।

আমি এটি বসন্ত ৪.৩.৫ এ পরীক্ষা করেছি এবং দেখেছি যে আচরণটি আসলে বাস্তবে একটি উত্থাপন ছাড়াই নাল মানকে ডিফল্ট মানে পরিণত করবে NumberFormatException; আমার আসল ম্যাপিং এখন ভাল কাজ করে।

আমি নিশ্চিত নই যে এই আচরণগত পরিবর্তনটি বসন্তের কোন সংস্করণে হয়েছিল।


অবশ্যই ব্যতিক্রমটি বাড়ানোর জন্য প্যারামিটারটি পূর্ণসংখ্যা হবে?

3
আমি বসন্ত বিশেষজ্ঞ নই, তবে যখন আপনি সেট না করেন তখন ডিফল্ট মানটি ব্যবহৃত হয়? অর্থাত্ যদি আপনার অনুরোধ থাকবে example.com/test ? আপনি যেমন উদাহরণ
..com

ধন্যবাদ amir75, দুর্ঘটনাক্রমে সরবরাহ করা Stringপ্রকার। ব্যবহারকারী 902383, এটি সঠিক, যদিও একটি পূর্ণসংখ্যার মানের জন্য আমি পছন্দ করব যে নাল / ফাঁকা মান পরিবর্তে ডিফল্ট মানটি ব্যবহার করবে।
ব্রেট রায়ান

উত্তর:


175

আপনি @ রিকোয়েস্টপ্যারাম টাইপটিকে একটি পূর্ণসংখ্যার সাথে পরিবর্তন করতে পারেন এবং এটির প্রয়োজন নেই। এটি আপনার অনুরোধটিকে সফল হতে দেবে, তবে এটি বাতিল হবে। আপনি এটি নিয়ন্ত্রণকারী পদ্ধতিতে স্পষ্টভাবে আপনার ডিফল্ট মানটিতে সেট করতে পারেন:

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", required=false) Integer i) {
    if(i == null) {
        i = 10;
    }
    // ...
}

আমি উপরের উদাহরণ থেকে ডিফল্টভ্যালুটি সরিয়েছি, তবে আপনি যদি অনুরোধগুলি গ্রহণ করার আশা করেন না যেখানে এটি মোটেও সেট করা হয়নি:

http://example.com/test

6
এটির একটি আপডেট, বসন্তের সাম্প্রতিক সংস্করণগুলিতে প্রকৃতপক্ষে আর নাল চেকের প্রয়োজন নেই কারণ পছন্দসই আচরণটি বসন্তের সাথে অন্তর্ভুক্ত করা হয়েছে যে খালি মানগুলি ডিফল্ট মান ব্যবহারের ফলস্বরূপ will
ব্রেট রায়ান

3
অচল উত্তর, সেরা সমাধানটি হ'ল @ অ্যাপলেন্ড
জোস পোজ এস

101

আপনি ডিফল্ট মান সেট করে আদিম ধরণের রাখতে পারেন, আপনার ক্ষেত্রে কেবল "প্রয়োজনীয় = মিথ্যা" সম্পত্তি যুক্ত করুন:

@RequestParam(value = "i", required = false, defaultValue = "10") int i

পিএস স্প্রিং ডকুমেন্টেশনের এই পৃষ্ঠাটি কার্যকর হতে পারে: টিক চিহ্নের অনুরোধের জন্য প্রম্পট


1
ধন্যবাদ তবে আপনি আমার প্রশ্নের পয়েন্টটি মিস করেছেন যা শিরোনামে রয়েছে। আমি খালি প্যারাম সরবরাহ করার দক্ষতার জন্য জিজ্ঞাসা করেছি /test?i=এবং যেহেতু iখালি তাই ডিফল্ট মান রয়েছে।
ব্রেট রায়ান

5
যাইহোক, যখন সরবরাহ করা defaultValueহয়েছিল, required == falseনিখুঁতভাবে
তৈমুর মিলোভানভ

4
যদি পরম সরবরাহ করা থাকে তবে খালি defaultValueথাকে তবে কার্যকর হয় না।
ব্রেট রায়ান

12

আপনি অনুরোধপারাম সেট করতে পারেন, জেনেরিকের পরিবর্তে জেনেরিক ক্লাস ইন্টিজার ব্যবহার করে এটি আপনার সমস্যার সমাধান করবে।

   @RequestParam(value= "i", defaultValue = "20") Integer i

1

আপনি এর মতো কিছু করতেও পারেন -

 @RequestParam(value= "i", defaultValue = "20") Optional<Integer> i

3
আপনার যদি ডিফল্ট মূল্য থাকে তবে এটিকে Oচ্ছিক করার দরকার নেই।
কেভিন এম

1

এটি 2013 সালে একটি বাগ হিসাবে বিবেচিত হয়েছিল: https://jira.spring.io/browse/SPR-10180

এবং সংস্করণ 3.2.2 সহ স্থির করা হয়েছিল। এর পরে কোনও সংস্করণে সমস্যা দেখা দেওয়া উচিত নয় এবং আপনার কোডটি ঠিকঠাকভাবে কাজ করা উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.