Javax.Validation - разрешить ноль, но проверить, если значение не - PullRequest
0 голосов
/ 08 ноября 2018

Я использую javax Validation.constraints и хочу подтвердить ввод, но разрешить ему быть нулевым, мой POJO:

public class somePOJO{
    @NotNull
    @Size(min =2, max=50)
    @Pattern(regexp="^[A-Za-z \\s\\-]*$")
    private String country;

    @Size(min =2,max=50)
    @Pattern(regexp="^[A-Za-z \\s\\-]*$")
    private String state;
    //gettes, setters.....

}

Я хочу проверить state, например, с @Pattern и @size, только если это не null.

Есть ли способ сделать это с помощью пользовательских аннотаций ?

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Это работает из коробки, как и следовало ожидать, например. в последнем Spring Boot, 2.1.0.

Какую версию загрузки Spring вы используете?

Вот полная версия POJO (обратите внимание, что я рекламирую неизменный класс):

package sk.ygor.stackoverflow.q53207105;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

public class SomePOJO {

    @NotNull
    @Size(min =2, max=50)
    @Pattern(regexp="^[A-Za-z \\s\\-]*$")
    private final String country;

    @Size(min =2,max=50)
    @Pattern(regexp="^[A-Za-z \\s\\-]*$")
    private final String state;

    public SomePOJO(String country, String state) {
        this.country = country;
        this.state = state;
    }

    public String getCountry() {
        return country;
    }

    public String getState() {
        return state;
    }

}

И полная версия контроллера:

package sk.ygor.stackoverflow.q53207105;

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@RestController
public class ExampleController {

    @RequestMapping(path = "/q53207105", method = RequestMethod.POST)
    public void test(@Valid @RequestBody SomePOJO somePOJO) {
        System.out.println("somePOJO.getCountry() = " + somePOJO.getCountry());
        System.out.println("somePOJO.getState() = " + somePOJO.getState());
    }

}

Вызов http://localhost:8080/q53207105 с:

{
    "country": "USA",
    "state": "California" 
}

Печать:

somePOJO.getCountry() = USA
somePOJO.getState() = California

Вызов http://localhost:8080/q53207105 с:

{
    "country": "USA",
}

Печать:

somePOJO.getCountry() = USA
somePOJO.getState() = null

Если вы скажете мне свою загрузочную версию Spring, я мог бы помочь больше.

0 голосов
/ 05 июня 2019

Ваш POJP будет работать, как и ожидалось, когда StringTrimmerEditor установлен в InitBinder .

У вас может быть приложение InitBinder, имеющее класс, подобный приведенному ниже, в вашем проекте.

@ControllerAdvice
public class CustomControllerAdvice {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
    }
}
0 голосов
/ 08 ноября 2018

Вы можете использовать чередующиеся конструкции в регулярных выражениях для разделения нескольких шаблонов. Просто разделите шаблоны, используя трубу '|' Т.е. добавьте регулярное выражение для пустой / пустой строки, исходя из ваших требований к существующему регулярному выражению. Образец ниже:

^(?:[A-Za-z \\s\\-]*|)$

Может быть не точным, но надеюсь, что вы поняли.

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