Рубрики
Без рубрики

Spring @автоматически подключается к пользовательскому валидатору JSF

– Spring @автоматически подключается к пользовательскому валидатору JSF

Автор оригинала: mkyong.

Вот сценарий, создайте пользовательский валидатор JSF, вводящий компонент через Spring @autowired .

package com.mkyong.user;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import com.mkyong.user.bo.UserService;

@Component
@Scope("request")
@FacesValidator("UsernameValidator")
public class UsernameValidator implements Validator {

	@Autowired
	UserService userService;
	
	@Override
	public void validate(FacesContext context, UIComponent component,
		Object value) throws ValidatorException {

	  String username = value.toString();

	  if(userService.isUsernameDuplicated(username)){
		FacesMessage facesMsg = new FacesMessage("Username is duplicated");
		facesMsg.setSeverity(FacesMessage.SEVERITY_ERROR);
		throw new ValidatorException(facesMsg);
	  }
		
	}

}

На странице JSF/XHTML свяжите ее с помощью Идентификатор валидатора .


	

Проблема

Во время запуска приложения файл журнала показывает, что Spring создает компонент “Usernamevalidator”, и Служба пользователя вводится успешно.

Однако при доступе со страницы JSF компонент UserService из “usernamevalidator” показывает значение null, что вызвало исключение NullPointerException.

Решение

Это потому, что @facesvalidator не управляется контейнером Spring. Чтобы исправить это, обратитесь к пользовательскому валидатору через привязку вместо Идентификатор валидатора .

P.S Spring, CDI и JSF проделали здесь действительно плохую работу (интегрировали друг друга), надеюсь, они смогут исправить это в будущем выпуске.


	

В пользовательском классе валидатора используется Spring или CDI только/| @facesvalidator не требуется.

@Component
@Scope("request")
public class UsernameValidator implements Validator {

	@Autowired
	UserService userService;
	//...
@Named
@RequestScoped
public class UsernameValidator implements Validator {

	@Autowired
	UserService userService;
	//...

Конечно, убедитесь, что автоматическое сканирование компонентов Spring включено.


	 
	
	
	  

Рекомендации

  1. Именованный объект не найден
  2. Пример пользовательского валидатора JSF 2

Оригинал: “https://mkyong.com/jsf2/spring-autowired-into-jsf-custom-validator/”