Как ограничить использование преобразователя типов конкретным контроллером c в Spring MVC? - PullRequest
0 голосов
/ 07 августа 2020

При работе с параметрами запроса, переменными пути или полями формы в Spring MVC мне приходится обрабатывать typeMismatch ошибки. Они происходят непосредственно перед началом валидации, что иногда может раздражать. Допустим, у меня есть параметр Integer, помеченный стандартным ограничением проверки, вроде: @Min(value = 0, message = "Only non-negative integer values can be accepted"). Затем я мог бы создать простой преобразователь строки в целое число, чтобы подавить NumberFormatException, установив все не анализируемые строковые значения на -1, чтобы они могли быть в дальнейшем недействительными из-за вышеупомянутого ограничения @Min:

@Component
final class StringToInteger implements Converter<String, Integer> {

    public Integer convert(String source) {
        try{
            return Integer.valueOf(source);
        } catch (NumberFormatException ex) {
            return -1;
        }
    }

}

Когда при использовании с Spring Boot аннотация @Component автоматически запускает этот конвертер и запускает его во всем контексте приложения, но что, если я хочу ограничить его использование только определенным c Controller или даже целевым запросом? Как это сделать проще всего?

1 Ответ

1 голос
/ 07 августа 2020

Вы можете использовать DataBinder. Вы объявляете это внутри своего контроллера.

    @InitBinder
    public void customizeBinding (DataBinder binder) {
        DefaultConversionService conversionService = new DefaultConversionService();
        conversionService.addConverter(new StringToInteger());
        binder.setConversionService(conversionService);
    }

EDIT: вместо этого вы можете использовать форматировщик.

@InitBinder
public void customizeBinding (DataBinder binder) {
    binder.addCustomFormatter(new StringToInteger());
}

class StringToInteger implements Formatter<Integer> {

    @Override
    public Integer parse(String s, Locale locale) throws ParseException {
        try {
            return Integer.valueOf(s);
        }
        catch (NumberFormatException ex) {
            return -1;
        }
    }

    @Override
    public String print(Integer i, Locale locale) {
        return Objects.toString(i);
    }
}
...