Как в методе @InitBinder вручную привязать данные, полученные из формы, к полям объекта в Spring Framework?

Как можно вручную связать данные из запроса с полями объекта класса `Person` в методе, аннотированном `@InitBinder`, в Spring MVC контроллере?
  • 5 декабря 2023 г. 14:31
Ответы на вопрос 1
Метод, аннотированный `@InitBinder`, используется в Spring MVC для уточнения того, как следует привязывать поля формы к полям объектов Java. Он часто используется для регистрации пользовательских преобразователей для определенных типов или для настройки форматирования. Однако прямой ручной привязки данных к полям объектов в методе `@InitBinder` не происходит. Вместо этого в `@InitBinder` можно настроить `WebDataBinder`, который затем используется Spring для автоматической привязки данных формы.

Вот пример класса `Person` и метода `@InitBinder`, который регистрирует кастомный редактор свойств для преобразования строковых значений в поля класса `Person`:

```java
public class Person {
    private String name;
    private int age;

    // getters and setters
}

@Controller
public class PersonController {

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        // Регистрация кастомного преобразователя для поля name
        binder.registerCustomEditor(String.class, "name", new PropertyEditorSupport() {
            @Override
            public void setAsText(String text) {
                // Преобразование значения из формы, например, всё к верхнему регистру
                setValue(text.toUpperCase());
            }
        });

        // Регистрация других кастомных преобразователей, если необходимо
    }
    
    @PostMapping("/person")
    public String submit(@ModelAttribute Person person) {
        // манипуляции с person
        return "personView";
    }
}
```

В примере выше `@ModelAttribute` используется в методе обработки запроса `submit` для автоматической привязки данных отправленной формы к объекту `Person` с использованием `WebDataBinder`, который был настроен в методе `initBinder`.

Напрямую связать поля запроса с полями объекта можно внутри метода, обрабатывающего запрос (например, `submit`), используя аннотацию `@RequestParam`, вот так:

```java
@PostMapping("/person")
public String submit(@RequestParam("name") String name, 
                     @RequestParam("age") int age,
                     Model model) {
    Person person = new Person();
    person.setName(name);
    person.setAge(age);
    // манипуляции с person...
    model.addAttribute("person", person);
    return "personView";
}
```

В этом примере вы явно забираете значения запроса с помощью `@RequestParam` и затем устанавливаете их вручную в поля объекта `Person`. Это не использует `@InitBinder`, но демонстрирует способ ручной работы с данными запроса.
Похожие вопросы