স্প্রিং এমভিসি: বৈধতা কীভাবে সম্পাদন করবেন?


156

আমি জানতে চাই যে ব্যবহারকারীর ইনপুটগুলির ফর্ম বৈধতা সম্পাদন করার সর্বোত্তম এবং সর্বোত্তম উপায়। আমি কিছু বিকাশকারীকে বাস্তবায়ন করতে দেখেছি org.springframework.validation.Validator। সে সম্পর্কে একটি প্রশ্ন: আমি দেখেছি এটি একটি শ্রেণিকে বৈধতা দেয়। ক্লাসটি কি ব্যবহারকারী ইনপুট থেকে মানগুলি দিয়ে ম্যানুয়ালি পূরণ করতে হবে এবং তারপরে যাচাইকরণকারীর কাছে পৌঁছে দিতে হবে?

ব্যবহারকারীর ইনপুটটি যাচাই করার সবচেয়ে পরিষ্কার এবং সর্বোত্তম উপায় সম্পর্কে আমি বিভ্রান্ত। আমি ব্যবহারের সনাতন পদ্ধতি সম্পর্কে request.getParameter()এবং তারপরে ম্যানুয়ালি পরীক্ষা করার জন্য জানি nulls, তবে আমার সমস্ত বৈধতা আমার মধ্যে করতে চাই না Controller। এই অঞ্চল সম্পর্কে কিছু ভাল পরামর্শ প্রশংসা করা হবে। আমি এই অ্যাপ্লিকেশনটিতে হাইবারনেট ব্যবহার করছি না।


উত্তর:


322

স্প্রিং এমভিসির সাথে, বৈধতা সম্পাদনের জন্য 3 টি পৃথক পদ্ধতি রয়েছে: টীকাগুলি, ম্যানুয়ালি বা উভয়ের মিশ্রণ ব্যবহার করে। যাচাই করার জন্য একটি অনন্য "পরিষ্কার এবং সর্বোত্তম উপায়" নেই, তবে সম্ভবত আপনার প্রকল্প / সমস্যা / প্রসঙ্গে আরও উপযুক্ত ফিট করে।

আসুন একটি ব্যবহারকারী আছে:

public class User {

    private String name;

    ...

}

পদ্ধতি 1: যদি আপনার কাছে স্প্রিং 3.x + এবং করার সহজ বৈধতা থাকে তবে javax.validation.constraintsটীকাগুলি (জেএসআর -303 টিকা হিসাবেও পরিচিত) ব্যবহার করুন।

public class User {

    @NotNull
    private String name;

    ...

}

আপনার লাইব্রেরিতে আপনার একটি জেএসআর -303 সরবরাহকারীর প্রয়োজন হবে, যেমন হাইবারনেট ভ্যালিডেটর যিনি রেফারেন্স বাস্তবায়ন করেন (এই লাইব্রেরির ডাটাবেস এবং রিলেশনাল ম্যাপিংয়ের সাথে কোনও সম্পর্ক নেই, এটি কেবল বৈধতা দেয় :-)।

তারপরে আপনার নিয়ামকটিতে আপনার এমন কিছু হবে:

@RequestMapping(value="/user", method=RequestMethod.POST)
public createUser(Model model, @Valid @ModelAttribute("user") User user, BindingResult result){
    if (result.hasErrors()){
      // do something
    }
    else {
      // do something else
    }
}

@ ভালিডটি লক্ষ্য করুন: যদি ব্যবহারকারীর একটি শূন্য নাম থাকে তবে ফলাফল.হাসআররেস () সত্য হবে।

পদ্ধতি 2: আপনার যদি জটিল বৈধতা থাকে (যেমন বড় ব্যবসায়ের বৈধতা যুক্তি, একাধিক ক্ষেত্র জুড়ে শর্তাধীন বৈধতা ইত্যাদি), বা কোনও কারণে আপনি পদ্ধতি 1 ব্যবহার করতে পারবেন না, ম্যানুয়াল বৈধতা ব্যবহার করুন। নিয়ন্ত্রণকারীর কোডকে বৈধতা যুক্তি থেকে আলাদা করা একটি ভাল অনুশীলন। স্ক্র্যাচ থেকে আপনার বৈধতা শ্রেণি (এস) তৈরি করবেন না, বসন্ত একটি কার্যকর org.springframework.validation.Validatorইন্টারফেস সরবরাহ করে (বসন্ত 2 থেকে) since

সুতরাং আসুন আমরা আপনাকে বলি

public class User {

    private String name;

    private Integer birthYear;
    private User responsibleUser;
    ...

}

এবং আপনি কিছু "জটিল" বৈধতা যেমন করতে চান: যদি ব্যবহারকারীর বয়স 18 বছরের কম হয়, তবে দায়বদ্ধ ব্যবহারকারীর শালীন হওয়া উচিত নয় এবং দায়বদ্ধ ব্যবহারকারীর বয়স 21 বছরের বেশি হওয়া উচিত।

আপনি এরকম কিছু করবেন

public class UserValidator implements Validator {

    @Override
    public boolean supports(Class clazz) {
      return User.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
      User user = (User) target;

      if(user.getName() == null) {
          errors.rejectValue("name", "your_error_code");
      }

      // do "complex" validation here

    }

}

তারপরে আপনার নিয়ামকের মধ্যে আপনার থাকতে হবে:

@RequestMapping(value="/user", method=RequestMethod.POST)
    public createUser(Model model, @ModelAttribute("user") User user, BindingResult result){
        UserValidator userValidator = new UserValidator();
        userValidator.validate(user, result);

        if (result.hasErrors()){
          // do something
        }
        else {
          // do something else
        }
}

যদি বৈধতা ত্রুটি থাকে, ফলাফল.হাসআরিয়ারস () সত্য হবে।

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

পদ্ধতি 3: কেন উভয় পদ্ধতির সংমিশ্রণ ব্যবহার করছেন না? সরল স্টাফগুলি, যেমন "নাম" বৈশিষ্ট্যের সাথে টিকা সহ (যা এটি করা দ্রুত, সংক্ষিপ্ত এবং আরও পঠনযোগ্য) বৈধ করুন। ভ্যালিডেটরদের জন্য ভারী বৈধতাগুলি রাখুন (যখন কাস্টম জটিল বৈধকরণের টীকাগুলি কোড করতে কয়েক ঘন্টা সময় লাগবে, বা ঠিক তখন টীকাগুলি ব্যবহার করা সম্ভব হবে না)। আমি এটি একটি প্রাক্তন প্রকল্পে করেছি, এটি কমন, দ্রুত এবং সহজের মতো কাজ করেছে।

সতর্কতা: ব্যতিক্রম হ্যান্ডলিংয়ের জন্য আপনার বৈধতা হ্যান্ডলিংয়ের ভুল করবেন না । এগুলি কখন ব্যবহার করবেন তা জানতে এই পোস্টটি পড়ুন

তথ্যসূত্র:


এই কনফিগারেশনটির জন্য আমার servlet.xML এর কী হওয়া উচিত তা আমাকে বলতে পারেন। আমি ত্রুটিগুলি আবার দর্শনে ফিরে যেতে চাই
দেবদার

@ দেব_ডারিন আপনি জেএসআর -303 বৈধতা জন্য কনফিগার বলতে চান?
জেরোম ডালবার্ট

2
@ দেব_মারিন বৈধতার জন্য, স্প্রিং ৩.x + তে, "সার্লেলেট.এক্সএমএল" বা "[সার্লেট-নাম] -সারলেট.এক্সএমএল-তে বিশেষ কিছুই নেই You আপনার প্রকল্পের লাইব্রেরিতে (বা মাভেনের মাধ্যমে) আপনার কেবল হাইবারনেট-বৈধকরণের জার দরকার। এগুলি হ'ল এটি তখনই কাজ করা উচিত War সতর্কতা যদি আপনি পদ্ধতি 3: ব্যবহার করেন তবে ডিফল্টরূপে, প্রতিটি কন্ট্রোলারের একটি জেএসআর -303 ভ্যালিডেটরের অ্যাক্সেস থাকে, সুতরাং "সেটভালিডেটর" দিয়ে এটিকে ওভাররাইড না করার বিষয়ে সতর্ক থাকুন custom উপরে, শুধু এটা instantiate এবং এটি ব্যবহার করুন, অথবা উদ্বুদ্ধ এটা (যদি এটি একটি বসন্ত উপাদান) আপনি এখনও Google এবং বসন্ত ডক পরীক্ষণ পর সমস্যা থেকে থাকে, আপনি একটি নতুন প্রশ্ন পোস্ট করা
জেরোম Dalbert

2
পদ্ধতির 1 এবং 2 এর মিশ্রণ ব্যবহারের জন্য, @ ইনিটবাইন্ডার ব্যবহারের একটি উপায় রয়েছে। "বাইন্ডার.সেটভালিডেটর (...)" এর পরিবর্তে, "বাইন্ডার.এডিডিভিডিয়েটারস (...)" ব্যবহার করতে পারেন
জেসনফুংসিং

1
আমি ভুল হলে আমাকে সংশোধন করুন, তবে আপনি @ ইন্ডিট বাইন্ডার টিকাটি ব্যবহার করার সময় জেএসআর -303 টিকা (পদ্ধতি 1) এবং কাস্টম বৈধকরণ (পদ্ধতি 2) এর মাধ্যমে বৈধতা মিশ্রন করতে পারেন। কেবলমাত্র বাইন্ডার.সেটভালিডেটর (ইউজারভালিডেটর) ​​এর পরিবর্তে বাইন্ডার.এডডিভিলেটেটর (ইউজারভালিডেটর) ​​ব্যবহার করুন এবং উভয় বৈধকরণ পদ্ধতি কার্যকর হবে।
সেবাস্তিয়ানআলিমার

31

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

আপনি যে ধরণের বৈধতা ব্যবহার করছেন তা নির্বিশেষে প্রকৃত বৈধতা অংশটি একই:

RequestMapping(value="fooPage", method = RequestMethod.POST)
public String processSubmit(@Valid @ModelAttribute("foo") Foo foo, BindingResult result, ModelMap m) {
    if(result.hasErrors()) {
        return "fooPage";
    }
    ...
    return "successPage";
}

আপনি যদি টীকাগুলি ব্যবহার করছেন, আপনার Fooশ্রেণিটি দেখতে দেখতে পারে:

public class Foo {

    @NotNull
    @Size(min = 1, max = 20)
    private String name;

    @NotNull
    @Min(1)
    @Max(110)
    private Integer age;

    // getters, setters
}

উপরের javax.validation.constraintsটিকাগুলি টীকাগুলি। আপনি হাইবারনেট ব্যবহার করতে পারেন তবে আপনি হাইবারনেট ব্যবহার করছেন এমনটি org.hibernate.validator.constraintsমনে হচ্ছে না।

বিকল্পভাবে, আপনি যদি বসন্তের যাচাইকারীকে প্রয়োগ করেন তবে আপনি নিম্নরূপে একটি শ্রেণি তৈরি করবেন:

public class FooValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return Foo.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {

        Foo foo = (Foo) target;

        if(foo.getName() == null) {
            errors.rejectValue("name", "name[emptyMessage]");
        }
        else if(foo.getName().length() < 1 || foo.getName().length() > 20){
            errors.rejectValue("name", "name[invalidLength]");
        }

        if(foo.getAge() == null) {
            errors.rejectValue("age", "age[emptyMessage]");
        }
        else if(foo.getAge() < 1 || foo.getAge() > 110){
            errors.rejectValue("age", "age[invalidAge]");
        }
    }
}

উপরের বৈধকরণকারীটি ব্যবহার করে, আপনাকে স্প্রিং কন্ট্রোলারের সাথে বৈধকরণকারীকেও আবদ্ধ করতে হবে (টীকাগুলি ব্যবহার করা হলে প্রয়োজনীয় নয়):

@InitBinder("foo")
protected void initBinder(WebDataBinder binder) {
    binder.setValidator(new FooValidator());
}

আরো দেখুন স্প্রিং ডক্স

আশা করি এইটি কাজ করবে.


স্প্রিংয়ের ভ্যালিডেটর ব্যবহার করার সময় আমাকে কি নিয়ামক থেকে পোজো সেট করতে হবে এবং তারপরে যাচাই করতে হবে?
দেবদার

আমি নিশ্চিত না যে আমি আপনার প্রশ্নটি বুঝতে পেরেছি। আপনি যদি নিয়ামক কোড স্নিপেট দেখতে পান, স্প্রিং Fooহ্যান্ডলার পদ্ধতিতে স্বয়ংক্রিয়ভাবে জমা দেওয়া ফর্মটিকে প্যারামিটারে আবদ্ধ করবে । আপনি কি স্পষ্ট করতে পারেন?
স্টিফেন.হানসন

ঠিক আছে আমি যা বলছি তা যখন ব্যবহারকারীর জমা দেওয়া হয় তখন কন্ট্রোলারটি http র অনুরোধ জানায়, সেখান থেকে যা ঘটে তা হল আপনি সমস্ত ইউজার প্যারামিটারগুলি পাওয়ার জন্য অনুরোধটি.টেটপ্যারামিটার () ব্যবহার করুন তারপরে পাসোতে মান নির্ধারণ করুন তারপর পাস করুন বৈধতা অবজেক্টে বর্গ। বৈধতা শ্রেণি ত্রুটিগুলি যদি দেখা যায় ত্রুটিগুলি দিয়ে আবার ভিউতে প্রেরণ করবে। এভাবেই কি হয়?
দেবদার

1
এটি এর মতো ঘটবে তবে একটি সহজ উপায় আছে ... আপনি যদি জেএসপি এবং একটি <ফর্ম: ফর্ম কমান্ডনেম = "ব্যবহারকারী"> জমা ব্যবহার করেন তবে ডেটা স্বয়ংক্রিয়ভাবে @ মডেলঅ্যাট্রিবিউট ("ব্যবহারকারী") ব্যবহারকারীকে কন্ট্রোলারে রেখে দেওয়া হয় পদ্ধতি। দস্তাবেজটি দেখুন: স্ট্যাটিক.স্প্রিংসোর্স.আর.স্প্রিং
জেরোম ডালবার্ট ২

+1 কারণ এটিই আমি প্রথম উদাহরণটি পেয়েছি যা @ মডেলঅ্যাট্রিবিউট ব্যবহার করে; এটি ছাড়া টিউটোরিয়ালের কোনওটিই আমি কাজ খুঁজে পাইনি।
রিকার্ডো কোসু

12

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

কাস্টম অবজেক্টের বৈধতার উদাহরণ:

@Target({ TYPE, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = { YourCustomObjectValidator.class })
public @interface YourCustomObjectValid {

    String message() default "{YourCustomObjectValid.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

public class YourCustomObjectValidator implements ConstraintValidator<YourCustomObjectValid, YourCustomObject> {

    @Override
    public void initialize(YourCustomObjectValid constraintAnnotation) { }

    @Override
    public boolean isValid(YourCustomObject value, ConstraintValidatorContext context) {

        // Validate your complex logic 

        // Mark field with error
        ConstraintViolationBuilder cvb = context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate());
        cvb.addNode(someField).addConstraintViolation();

        return true;
    }
}

@YourCustomObjectValid
public YourCustomObject {
}

জেনেরিক ক্ষেত্রের সমতার উদাহরণ:

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Target({ TYPE, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = { FieldsEqualityValidator.class })
public @interface FieldsEquality {

    String message() default "{FieldsEquality.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    /**
     * Name of the first field that will be compared.
     * 
     * @return name
     */
    String firstFieldName();

    /**
     * Name of the second field that will be compared.
     * 
     * @return name
     */
    String secondFieldName();

    @Target({ TYPE, ANNOTATION_TYPE })
    @Retention(RUNTIME)
    public @interface List {
        FieldsEquality[] value();
    }
}




import java.lang.reflect.Field;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ReflectionUtils;

public class FieldsEqualityValidator implements ConstraintValidator<FieldsEquality, Object> {

    private static final Logger log = LoggerFactory.getLogger(FieldsEqualityValidator.class);

    private String firstFieldName;
    private String secondFieldName;

    @Override
    public void initialize(FieldsEquality constraintAnnotation) {
        firstFieldName = constraintAnnotation.firstFieldName();
        secondFieldName = constraintAnnotation.secondFieldName();
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        if (value == null)
            return true;

        try {
            Class<?> clazz = value.getClass();

            Field firstField = ReflectionUtils.findField(clazz, firstFieldName);
            firstField.setAccessible(true);
            Object first = firstField.get(value);

            Field secondField = ReflectionUtils.findField(clazz, secondFieldName);
            secondField.setAccessible(true);
            Object second = secondField.get(value);

            if (first != null && second != null && !first.equals(second)) {
                    ConstraintViolationBuilder cvb = context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate());
          cvb.addNode(firstFieldName).addConstraintViolation();

          ConstraintViolationBuilder cvb = context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate());
          cvb.addNode(someField).addConstraintViolation(secondFieldName);

                return false;
            }
        } catch (Exception e) {
            log.error("Cannot validate fileds equality in '" + value + "'!", e);
            return false;
        }

        return true;
    }
}

@FieldsEquality(firstFieldName = "password", secondFieldName = "confirmPassword")
public class NewUserForm {

    private String password;

    private String confirmPassword;

}

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

1
আপনি পদ্ধতিতে একটি টীকা যাচাই করতে পারেন। সুতরাং আমি যদি আপনার প্রশ্নটি বুঝতে পারি তবে আপনি নিজের "ডোমেন বৈধতা" তৈরি করতে পারেন। এই জন্য আপনি নির্দিষ্ট করতে হবে ElementType.METHODসালে @Target
michal.kreuzman

আপনি যা বলছেন তা আমি বুঝতে পারি আপনি আরও পরিষ্কার ছবির জন্য আমাকে উদাহরণের দিকেও নির্দেশ করতে পারেন।
দেবদার

4

আপনার যদি একই পদ্ধতিতে বিভিন্ন পদ্ধতি হ্যান্ডলারের লজিক পরিচালনার ক্ষেত্রে ত্রুটি থাকে তবে নিম্নলিখিত কোড প্যাটার্ন সহ আপনি প্রচুর হ্যান্ডলারের সাথে সমাপ্ত হবেন:

if (validation.hasErrors()) {
  // do error handling
}
else {
  // do the actual business logic
}

মনে করুন আপনি আরএসএফুল সার্ভিস তৈরি করছেন এবং 400 Bad Requestপ্রতিটি বৈধতা ত্রুটির ক্ষেত্রে ত্রুটি বার্তাগুলি সহ ফিরে আসতে চান । তারপরে, ত্রুটিটি পরিচালনা করার অংশটি প্রতিটি একক REST শেষ পয়েন্টের জন্য একই হবে যার বৈধতা প্রয়োজন। প্রতিটি একক হ্যান্ডলারে খুব একই যুক্তি পুনরাবৃত্তি করা এতটা DRY ইশ নয়!

এই সমস্যাটি সমাধান করার একটি উপায় হ'ল BindingResultপ্রতিটি টু-বি-ভ্যালিডেট শিমের সাথে সাথে তাত্ক্ষণিকভাবে ড্রপ করা । এখন, আপনার হ্যান্ডলারটি এটির মতো হবে:

@RequestMapping(...)
public Something doStuff(@Valid Somebean bean) { 
    // do the actual business logic
    // Just the else part!
}

এইভাবে, যদি সীমাবদ্ধ শিমটি বৈধ না হয় তবে একটি MethodArgumentNotValidExceptionস্প্রিংয়ের মাধ্যমে নিক্ষেপ করা হবে। আপনি ControllerAdviceসেই একই ত্রুটি পরিচালনার যুক্তি দিয়ে এই ব্যতিক্রমটিকে পরিচালনা করে এমন একটি সংজ্ঞা দিতে পারেন :

@ControllerAdvice
public class ErrorHandlingControllerAdvice {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public SomeErrorBean handleValidationError(MethodArgumentNotValidException ex) {
        // do error handling
        // Just the if part!
    }
}

আপনি এখনও অন্তর্নিহিত BindingResultব্যবহারের getBindingResultপদ্ধতিটি পরীক্ষা করতে পারেন MethodArgumentNotValidException


1

স্প্রিং এমভিসি বৈধকরণের সম্পূর্ণ উদাহরণটি সন্ধান করুন

import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import com.technicalkeeda.bean.Login;

public class LoginValidator implements Validator {
    public boolean supports(Class aClass) {
        return Login.class.equals(aClass);
    }

    public void validate(Object obj, Errors errors) {
        Login login = (Login) obj;
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userName",
                "username.required", "Required field");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userPassword",
                "userpassword.required", "Required field");
    }
}


public class LoginController extends SimpleFormController {
    private LoginService loginService;

    public LoginController() {
        setCommandClass(Login.class);
        setCommandName("login");
    }

    public void setLoginService(LoginService loginService) {
        this.loginService = loginService;
    }

    @Override
    protected ModelAndView onSubmit(Object command) throws Exception {
        Login login = (Login) command;
        loginService.add(login);
        return new ModelAndView("loginsucess", "login", login);
    }
}

0

আপনার বিন্যাস ক্লাসে এই শিমটি রাখুন।

 @Bean
  public Validator localValidatorFactoryBean() {
    return new LocalValidatorFactoryBean();
  }

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

 <T> BindingResult validate(T t) {
    DataBinder binder = new DataBinder(t);
    binder.setValidator(validator);
    binder.validate();
    return binder.getBindingResult();
}

ম্যানুয়ালি একটি শিম বৈধতা জন্য। তারপরে আপনি বাইন্ডারিংসাল্টে সমস্ত ফলাফল পাবেন এবং আপনি সেখান থেকে পুনরুদ্ধার করতে পারেন।

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