سؤال

هذا المثال مفترض بعض الشيء. لقد قمت بتبسيطها لإزالة التفاصيل الغريبة والتركيز على المشكلة التي أواجهها. لديّ مدقق يشبه هذا:

@Component
public class UniqueUsernameValidator implements ConstraintValidator<UniqueUsername, String> {

    @Autowired
    UsernameService usernameService;

    @Override
    public void initialize(UniqueUsername uniqueUsername) {
    }

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        return !usernameService.exists(s);
    }   
}

أتصل بالمقحة من وحدة التحكم الخاصة بي مثل هذا:

@RequestMapping
public void checkUsername(Model model, User user) {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();

    Set<ConstraintViolation<User>> constraintViolations = validator.validateProperty(user, "username");
    model.addAttribute("error", constraintViolations.size() > 0);
}

ومع ذلك ، ما زلت أحصل على NullPointerException استثناء. أضفت نقطة توقف في المدقق الخاص بي ورأيت ذلك usernameService كنت null. لماذا لا تحصل على تلقائي؟ في البداية اعتقدت أن ذلك كان لأنني لم أشرح المدقق مع @Component, ، لكن لا يزال لدي نفس المشكلة حتى بعد التعليق عليها. ال UsernameService لقد تم بالفعل شرح الفصل الدراسي مع @Service ويمكنني التحقق من أن مُنشئه يتم استدعاؤه.

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

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

المحلول

في الربيع ، تحتاج إلى الحصول عليها ValidatorFactory (أو Validator نفسها) عبر LocalValidatorFactoryBean بدلاً من Validation.buildDefaultValidatorFactory(), ، كما وصفت في المرجع.

@Autowired
Validator validator;

@RequestMapping 
public void checkUsername(Model model, User user) { 
    Set<ConstraintViolation<User>> constraintViolations = validator.validateProperty(user, "username"); 
    model.addAttribute("error", constraintViolations.size() > 0); 
} 

-

<bean id="validator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

تعديل: ولكن ربما تكون أفضل طريقة للقيام بذلك هي استخدام التحقق التلقائي من Spring MVC مع @Valid حاشية. ملاحظة:

@RequestMapping  
public void checkUsername(Model model, @Valid User user, BindingResult result) {  
    if (result.hasErrors()) {   
        ...
    }
}

هذا يتطلب أيضا <mvc:annotation-driven/> في التكوين.

نصائح أخرى

بدلاً من إنشاء مدقق جديد ، يجب عليك التلقائي أو حقنه إلى وحدة التحكم. ال NPE من الخدمة التي لا يتم حقنها حيث لا يتم إنشاء/إدارتها من قبل المدقق بحلول الربيع.

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