تلقائي خدمة في خدمة المدقق
-
01-10-2019 - |
سؤال
هذا المثال مفترض بعض الشيء. لقد قمت بتبسيطها لإزالة التفاصيل الغريبة والتركيز على المشكلة التي أواجهها. لديّ مدقق يشبه هذا:
@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
من الخدمة التي لا يتم حقنها حيث لا يتم إنشاء/إدارتها من قبل المدقق بحلول الربيع.