Можно ли пропустить проверку аннотации в Spring - PullRequest
0 голосов
/ 16 июня 2020

У меня есть сущность «Пользователь», поле имени пользователя которой аннотировано проверкой @UniqueUsername. При получении запроса в контроллере я использую аннотацию @Valid для проверки. Это отлично работает, когда я создаю пользователей. Но у меня проблемы с редактированием существующих пользователей, потому что я не могу заставить Spring игнорировать @UniqueUsername, поэтому каждое редактирование не выполняется. Есть ли способ заставить Spring игнорировать @UniqueUsername при редактировании / обновлении информации о пользователе?

Это мой упрощенный код:

User

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    //my custom validator
    @UniqueUsername
    private String username;
    public int getId() {
    return id;

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

UniqueUsername

@Constraint(validatedBy = UniqueUsernameValidator.class)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface UniqueUsername {
    String message() default "Username already exists";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

UniqueUsernameValidator

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

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    public void initialize(UniqueUsername username) {
    }

    @Override
    public boolean isValid(String username, ConstraintValidatorContext context) {
        return !userDetailsService.isUsernameAlreadyInUse(username);
    }
}

Метод в моем контроллере выглядит следующим образом:

public String updateUser(@PathVariable("id") int id, @Valid User user, BindingResult result, Model model) 

1 Ответ

1 голос
/ 16 июня 2020

Чтобы узнать, находится ли переменная пути id внутри UniqueUsernameValidator, вы можете сделать следующее:

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

    @Autowired
    private HttpServletRequest request;

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    public void initialize(UniqueUsername username) {
    }

    @Override
    public boolean isValid(String username, ConstraintValidatorContext context) {
        Map<String, String> uriVars = (Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);

        if (uriVars != null) {
          String idStr = uriVars.get("id");

          if (idStr != null) {
            int id = Integer.valueOf(ValidationUtils.getPathVariable(request, "id"));

            return !userDetailsService.isUserNameAlreadyInUseForAnotherId(userName, id);
          }
        }

        return !userDetailsService.isUsernameAlreadyInUse(username);
    }
}

Вы можете получить переменную пути из введенного HttpServletRequest и реализовать новый сервисный метод isUserNameAlreadyInUseForAnotherId и выполнить проверки специально для случая обновления. Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...