@ ভালিড টীকাটি বসন্তে কী নির্দেশ করে?


88

নিম্নলিখিত উদাহরণে, ScriptFileপরামিতিটি একটি @Validটীকা দিয়ে চিহ্নিত করা হয়েছে ।

@Validটিকা কী করে ?

@RequestMapping(value = "/scriptfile", method = RequestMethod.POST)    
public String create(@Valid ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {    
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");        
    if (result.hasErrors()) {        
        modelMap.addAttribute("scriptFile", scriptFile);            
        modelMap.addAttribute("showcases", ShowCase.findAllShowCases());            
        return "scriptfile/create";            
    }        
    scriptFile.persist();        
    return "redirect:/scriptfile/" + scriptFile.getId();        
}    

উত্তর:


63

এটি বৈধতার উদ্দেশ্যে।

বৈধতা কোনও মডেলটির সাথে ব্যবহারকারীর ইনপুট বাঁধার পরে বৈধতা দেওয়া সাধারণ। স্প্রিং 3 জেএসআর -303 এর সাথে ঘোষণামূলক বৈধতার জন্য সহায়তা সরবরাহ করে। এই সমর্থনটি যদি স্বয়ংক্রিয়ভাবে সক্ষম হয় যদি কোনও জেএসআর -303 সরবরাহকারী যেমন হাইবারনেট ভ্যালিডেটর আপনার ক্লাসপথে উপস্থিত থাকে। সক্ষম করা থাকলে, আপনি কেবলমাত্র @ কালিমা টীকা সহ একটি নিয়ামক পদ্ধতি পরামিতিটি উল্লেখ করে বৈধতাটিকে ট্রিগার করতে পারেন: আগত পোস্টের পরামিতিগুলিকে আবদ্ধ করার পরে, অ্যাপয়েন্টমেন্ট অ্যাপয়েন্টমেন্টটি বৈধ হবে; এই ক্ষেত্রে, তারিখের ক্ষেত্রের মানটি শূন্য করা নিখুঁত নয় এবং ভবিষ্যতে ঘটে occurs


আরও তথ্যের জন্য এখানে দেখুন:
http://blog.springsource.com/2009/11/17/spring-3-type-conversion-and-)ation/


37

উপরের উত্তরে যুক্ত করা, নীচের দিকে একবার নজর দিন। AppointmentFormএর dateকলামটি কয়েকটি টিকা নিয়ে টীকাগুলি রয়েছে। না থাকার @Validটীকা যে ট্রিগার যাচাই AppointmentForm(এই ক্ষেত্রে @NotNullএবং @Future)। এই টীকাগুলি বিভিন্ন জেএসআর -303 সরবরাহকারী (যেমন, হাইবারনেট, স্প্রিং..টেক) থেকে আসতে পারে।

    @RequestMapping(value = "/appointments", method = RequestMethod.POST)
    public String add(@Valid AppointmentForm form, BindingResult result) {
        ....
    }

    static class AppointmentForm {

        @NotNull @Future
        private Date date;
    }

4
আমারও অনুরূপ কোড রয়েছে। আমি মুছে ফেলেছিলেন @Validউপর ApplicationFormপরামিতি কিন্তু, এখনও যাচাই উপর ছোড়া date(সেট হিসাবে null) ক্ষেত্র। দয়া করে ব্যাখ্যা করুন.
lupchiazoem

18

@Validনিজেই স্প্রিংয়ের সাথে কিছুই করার নেই। এটি বিনের বৈধকরণের নির্দিষ্টকরণের অংশ (এর মধ্যে বেশ কয়েকটি রয়েছে, সর্বশেষ 2017 সালের দ্বিতীয়ার্ধে জেএসআর 380), তবে@Valid হ'ল এটি খুব পুরানো এবং জেএসআর 303 থেকে পুরো পথটি পেয়েছে।

যেমনটি আমরা সবাই জানি, স্প্রিং সাধারণভাবে বিভিন্ন জেএসআর এবং জাভা গ্রন্থাগারগুলির (জেপিএ, জেটিএ, ক্যাচিং ইত্যাদি বিবেচনা করুন) সাথে একত্রীকরণের ক্ষেত্রে খুব ভাল এবং অবশ্যই এই ছেলেরাও বৈধতার যত্ন নিয়েছিল। এটির সুবিধার্থে অন্যতম মূল উপাদান হ'ল মেথডভালিডেশনপোস্টপ্রসেসর

আপনার প্রশ্নের উত্তর দেওয়ার চেষ্টা করা - @Validযখন আপনি কোনও জটিল গ্রাফকে বৈধতা দিতে চান কেবল কোনও সামগ্রীর শীর্ষ স্তরের উপাদান নয় তবে তথাকথিত বৈধতা ক্যাসকেডিংয়ের জন্য খুব কার্যকর very যতবার আপনি আরও গভীর হতে চান, আপনাকে ব্যবহার করতে হবে @Valid। এটাই জেএসআর নির্দেশ দেয়। স্প্রিং কিছু ছোট ছোট বিচ্যুতির সাথে এটি মেনে চলবে (উদাহরণস্বরূপ আমি রেস্টকন্ট্রোলার পদ্ধতি এবং বৈধকরণের কাজের @Validatedপরিবর্তে রাখার চেষ্টা করেছি @Valid, তবে এটি নিয়মিত "পরিষেবা" মটরশুটিগুলির জন্য প্রযোজ্য হবে না)।


কিন্তু, কী বৈধতা দেয়?
ভাগ্নে

দয়া করে বিস্তারিত, @ নেফেটোম আপনি কি স্পষ্ট করতে চান?
ইয়ুরানস

আমি জেএসআর 303 পড়েছি: বিনের বৈধকরণ, beanificationsation.org/1.0/spec তবে এখনও কী বৈধতা কার্যকর হবে তা আমি পাই না ScriptFile scriptFile
ভাগ্নে

এর ভিতরে স্ক্রিপ্টফাইলে সম্ভবত একগুচ্ছ ক্ষেত্র রয়েছে এবং সেই ক্ষেত্রগুলিতে তাদের উপরও টীকা রয়েছে। এটিই যেখানে বৈধতাটি কিক করে the মূল প্রশ্নের উপর ভিত্তি করে এটি স্ক্রিপ্ট ফাইল শ্রেণীর ভিতরে ঠিক কী তা পরিষ্কার নয়।
ইওরানোস

ঠিক আছে ধন্যবাদ. আপনি যদি তার ক্ষেত্রগুলিতে একটি স্ট্রিং, একটি পূর্ণসংখ্যা এবং একটি শিমের সাথে বৈধতা প্রমাণ করতে পারেন তার উদাহরণ স্থাপন করতে পারেন?
ভাগ্নে

17

আইআইআরসি @ ভালিড একটি স্প্রিং টীকা নয়, একটি জেএসআর -303 টিকা (যা বিন বৈধির মান)। এটি যা করে তা হ'ল মূলত যাচাই করে আপনি পদ্ধতিটিতে প্রেরিত ডেটা বৈধ কিনা বা না (এটি আপনার জন্য স্ক্রিপ্টফাইলে বৈধতা দেবে)।


4
"এটি আপনার জন্য স্ক্রিপ্ট ফাইলটি বৈধতা দেবে" এর অর্থ কী? এটি নাল নয়, এটির কিছু বাক্য গঠন আছে বা কিছু সামগ্রী রয়েছে তা দেখুন? অন্য কথায়, এটি কীভাবে বৈধ হয় এবং কীভাবে? ব্যবহারকারীর কিছু বাস্তবায়ন করা উচিত? আমি এটি সম্পর্কে কোথায় তথ্য পেতে পারি? ধন্যবাদ!
ভাগ্নে

দয়া করে @ ভাগ্নের প্রশ্নের উত্তর দিন, অনুপস্থিত মূল পয়েন্টটি "কিসের বিরুদ্ধে" তা বৈধ করার পক্ষে যথেষ্ট উত্তর নেই?
Monami

2
public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {    
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");        

আমি মনে করি এই @NotNullটীকাটি বৈধ তাই শর্ত প্রয়োজন না হলে।


1

কেবলমাত্র উপরের উত্তরে যুক্ত করা, এমন একটি ওয়েব অ্যাপ্লিকেশন @validব্যবহৃত হয় যেখানে শিমটি যাচাই করতে হবে যাচাইকরণের টীকাগুলি যেমন @NotNull, @Email(হাইবারনেট টীকা) দিয়েও ডাকা হয় যাতে ব্যবহারকারীর কাছ থেকে ইনপুট পাওয়ার সময় মানগুলি বৈধ করা যায় এবং বাধ্যতামূলক ফলাফলের বৈধতা থাকবে ফলাফল। bindingResult.hasErrors()কোনও বৈধতা ব্যর্থ হয়েছে কিনা তা বলবে।


1

উপরে উল্লিখিত @ ভালিদ এর আর একটি সহজ দিকটি হ'ল (যেমন: পোস্টম্যানকে একটি শেষ পয়েন্ট পরীক্ষা করার জন্য ব্যবহার করা) @ ভালিড সবেমাত্র পাঠযোগ্য পাঠ্যের একটি ব্লবের পরিবর্তে একটি ভুল আরএসটি কলের আউটপুটটিকে ফর্ম্যাট করা JSON এ ফর্ম্যাট করবে। আপনি যদি আপনার ব্যবহারকারীদের জন্য বাণিজ্যিকভাবে গ্রাসযোগ্য এপিআই তৈরি করে থাকেন তবে এটি খুব কার্যকর।


1

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

আমি কীভাবে @ ভালিড ব্যবহার করেছি সে সম্পর্কে আমি 3 টি পরিস্থিতি উপস্থাপন করব

মডেল:

public class Employee{
private String name;
@NotNull(message="cannot be null")
@Size(min=1, message="cannot be blank")
private String lastName;
 //Getters and Setters for both fields.
 //...
}

জেএসপি:

...
<form:form action="processForm" modelAttribute="employee">
 <form:input type="text" path="name"/>
 <br>
 <form:input type="text" path="lastName"/>
<form:errors path="lastName"/>
<input type="submit" value="Submit"/>
</form:form>
...

দৃশ্যের জন্য নিয়ামক 1:

     @RequestMapping("processForm")
        public String processFormData(@Valid @ModelAttribute("employee") Employee employee){
        return "employee-confirmation-page";
    }

এই পরিস্থিতিতে, খালি লাস্টনাম ফিল্ডের সাথে আপনার ফর্মটি জমা দেওয়ার পরে, আপনি বৈধতার বিধি প্রয়োগ করছেন তবে আপনি এটির কোনও পরিচালনা করছেন না সেজন্য একটি ত্রুটি পৃষ্ঠা পাবেন।

বলেছেন ত্রুটির উদাহরণ: ব্যতিক্রম পৃষ্ঠা

দৃশ্যের জন্য নিয়ামক 2:

 @RequestMapping("processForm")
    public String processFormData(@Valid @ModelAttribute("employee") Employee employee,
BindingResult bindingResult){
                return bindingResult.hasErrors() ? "employee-form" : "employee-confirmation-page";
            }

এই দৃশ্যে, আপনি সেই বৈধতা থেকে সমস্ত ফলাফলকে বাইন্ডিংরসাল্টে পাঠিয়ে দিচ্ছেন, সুতরাং সেই ফর্মটির বৈধতা ফলাফলের সাথে কী করবেন তা সিদ্ধান্ত নেওয়া আপনার পক্ষে।

দৃশ্যের জন্য নিয়ামক 3:

@RequestMapping("processForm")
    public String processFormData(@Valid @ModelAttribute("employee") Employee employee){
                return "employee-confirmation-page";
            }
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, String> invalidFormProcessor(MethodArgumentNotValidException ex){
  //Your mapping of the errors...etc
}

এই দৃশ্যে আপনি এখনও প্রথম দৃশ্যের মতো ত্রুটিগুলি পরিচালনা করছেন না, তবে আপনি ফর্মের মডেলটি প্রক্রিয়া করার সময় @ ভালিদ ট্রিগার হওয়ার ব্যতিক্রমের যত্ন নেবে এমন একটি অন্য পদ্ধতিতে এটি পাস করেছেন । পরীক্ষা করে দেখুন এই দেখুন সেখানে কি ম্যাপিং এবং যা কিছু করার।

সংক্ষিপ্তসার হিসাবে : @ ভালিড এর সাথে নিজের মতো করে আর কিছুই করবেন না যা বৈধতার জেএসআর 303 টি টীকাযুক্ত ক্ষেত্রগুলির ( @ নটনুল, @ ইমেল, @ সাইজ, ইত্যাদি ... ) যাচাইকরণের প্রেরণা দেয় , আপনাকে এখনও কী করতে হবে তার কৌশল নির্দিষ্ট করতে হবে যাচাইয়ের ফলাফলের সাথে।

আশা করি আমি লোকেদের জন্য এমন কিছু সাফ করতে সক্ষম হয়েছি যার ফলে এটি হোঁচট খায়।


1

আমি কীভাবে সে সম্পর্কে আরও বিশদ যুক্ত করতে চেয়েছিলাম @Valid কাজ করে , বিশেষত বসন্তে।

বসন্তে বৈধতার বিষয়ে আপনি যা জানতে চান তার সমস্ত কিছু https://reflectoring.io/bean-ediaation-with-spring-boot/ এ পরিষ্কারভাবে এবং বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে , তবে আমি কীভাবে @Validলিঙ্কটি যুক্ত করে তার উত্তরটি অনুলিপি করব নিচে যায়

@Validটীকা তাদের যাচাই করতে বিশ্রাম নিয়ামক পদ্ধতিতে ভেরিয়েবল যোগ করা যেতে পারে। এখানে 3 ধরণের ভেরিয়েবল যাচাই করা যেতে পারে:

  • অনুরোধ সংস্থা,
  • পথের মধ্যে ভেরিয়েবল (উদাহরণস্বরূপ / foos / {id id আইডি) এবং,
  • কোয়েরি পরামিতি।

সুতরাং এখন ... কিভাবে বসন্ত "বৈধতা"? আপনি কোনও শ্রেণীর ক্ষেত্রগুলিতে সীমাবদ্ধতাগুলি নির্দিষ্ট টীকা দিয়ে উল্লেখ করতে পারেন। তারপরে, আপনি সেই শ্রেণীর একটি বস্তুকে একটি ভ্যালিডেটরে পাস করেন যা সীমাবদ্ধতাগুলি সন্তুষ্ট কিনা তা পরীক্ষা করে।

উদাহরণস্বরূপ, ধরুন আমার কাছে এর মতো নিয়ামক পদ্ধতি ছিল:

@RestController
class ValidateRequestBodyController {

  @PostMapping("/validateBody")
  ResponseEntity<String> validateBody(@Valid @RequestBody Input input) {
    return ResponseEntity.ok("valid");
  }

}

সুতরাং এটি একটি পোস্ট অনুরোধ যা একটি প্রতিক্রিয়া বডি গ্রহণ করে এবং আমরা একটি প্রতিক্রিয়া বডিটিকে একটি শ্রেণিতে ম্যাপ করছি Input

এখানে ক্লাস Input:

class Input {

  @Min(1)
  @Max(10)
  private int numberBetweenOneAndTen;

  @Pattern(regexp = "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$")
  private String ipAddress;
  
  // ...
}

@ ভালিড টীকাটি বসন্তকে বলবে এবং নিয়ামকের কাছে পাস করা ডেটা যাচাই করে তা দেখতে পূর্ণসংখ্যার পরীক্ষা করে numberBetweenOneAndTen 1 থেকে 10 এর মধ্যেএটি এনপোটেশনে নিয়মিত প্রকাশের সাথে আইপি ঠিকানাটি পাস করা হয়েছে কিনা তাও পরীক্ষা করে দেখুন।

পার্শ্ব দ্রষ্টব্য: নিয়মিত প্রকাশটি নিখুঁত নয় .. আপনি 3 ডিজিটের সংখ্যায় পাস করতে পারেন যা 255 এর বেশি এবং এটি এখনও নিয়মিত প্রকাশের সাথে মিলবে match


এখানে ক্যোয়ারী ভেরিয়েবল এবং পাথ ভেরিয়েবলকে বৈধতা দেওয়ার একটি উদাহরণ রয়েছে:

@RestController
@Validated
class ValidateParametersController {

  @GetMapping("/validatePathVariable/{id}")
  ResponseEntity<String> validatePathVariable(
      @PathVariable("id") @Min(5) int id) {
    return ResponseEntity.ok("valid");
  }
  
  @GetMapping("/validateRequestParameter")
  ResponseEntity<String> validateRequestParameter(
      @RequestParam("param") @Min(5) int param) { 
    return ResponseEntity.ok("valid");
  }
}

এই ক্ষেত্রে, যেহেতু ক্যোয়ারী ভেরিয়েবল এবং পাথ ভেরিয়েবল কেবল জটিল ক্লাসগুলির পরিবর্তে কেবলমাত্র পূর্ণসংখ্যা হয়, তাই আমরা @Min(5)ব্যবহারের পরিবর্তে সীমাবদ্ধ টীকাটি প্যারামিটারের উপরে রাখি @Valid

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