Как проверить объект JSON на соответствие существующим классам XXXValidator, используемым для проверки формы? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть контроллер, сущность и валидатор для моего проекта.

Контроллер выглядит примерно так:

@RequestMapping("foo")
@Controller
public class RequestMapper {
   @RequestMapping("jsonCreate")
   @ResponseBody
   public String createInfo(@Valid @ModelAttribute("node") String nodeJson)  throws JsonParseException, JsonMappingException, IOException {
      Foo obj = new ObjectMapper().readValue(nodeJson, Foo.class);

      ///missing validation

      fooDao.save(obj);
    }
}



@Entity
public class Foo {
   @NotNull
   private String bar;

   ///getters, setters, constructors omitted
}


public class FooValidator {
    @NotEmpty(message = "Bar cannot be null")
    @Size(min = 2, message = "Bar must be a minimum of 2 characters long")
    private String bar;

    ////getters, setters and constructors omitted
}

Итак, когда я пытаюсь вызвать createInfoметод с JSON: {"bar": "a"}

Я не получаю никакой проверки, которую я делаю в форме (не неожиданно, но все еще ошибка, которую нужно исправить).

Может ли кто-нибудь указать мне, что должно произойти, чтобы FooValidator правильно исследовал объект Foo?

Я попытался поместить это в FooValidator:

public<T> List<String> validate (T input) {
  List<String> errors = new ArrayList<>();

  Set<ConstraintViolation<T>> violations = Validation.buildDefaultValidatorFactory().getValidator().validate(input);
  if (violations.size() > 0) {
        for (ConstraintViolation<T> violation : violations) {
       errors.add(violation.getPropertyPath() + " " + violation.getMessage());
    }
  }
}

И затемВызов

new FooValidator().validate(foo);

, но ничего не произошло с длиной не менее 2 символов.

1 Ответ

0 голосов
/ 20 декабря 2018

Вы должны поставить FooValidator после @Valid, затем использовать ModelMapper для преобразования FooValidator в Foo

@Autowired
ModelMapper modelMapper;

public String createInfo(@Valid @ModelAttribute("node") FooValidator fooValidator) {

    Foo foo = modelMapper.map(fooValidator, Foo.class)

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