Spring MVC создает дочерний объект при отправке формы, когда этого не следует

У меня проблема, когда создается дочерний объект, хотя моя форма не указывает, что он должен быть создан. Проблема, которую я получаю, заключается в том, что при отправке формы возникают ошибки поля проверки, в которых указано, что фамилия и имя вторичного пользователя отсутствуют.

В идеале я хочу, чтобы вторичное значение оставалось нулевым и, следовательно, не проверялось при отправке формы.

HTML-форма (вырезана для простоты):

<form th:action = "@{/quotes/save}" th:object = "${quote}">
    <input type = "text" th:field = "*{primary.lastName}" />
    <input type = "text" th:field = "*{primary.firstName}" />
</form>

Объект Quote:

@Entity    
public class Quote {
    @ManyToOne
    @Valid
    @NotNull(groups = {Quote.ValidationPrimary.class})
    private Person primary;

    @ManyToOne
    @Valid
    private Person secondary;
}

Объект Person:

@Entity
public class Person {
    @NotEmpty
    private String lastName;

    @NotEmpty
    private String firstName;
}

QuoteController:

@Controller
public class QuoteController {

    @PostMapping("/quotes/save")
    public String save(@ModelAttribute @Validated({Quote.ValidationPrimary.class}) Quote quote, BindingResult bindingResult) {
        quote.getPrimary(); // this contains a Person object... as expected
        quote.getSecondary(); // this also contains a Person object... which is NOT EXPECTED
        ...
    }
}
1
0
47
1

Ответы 1

Не используйте имя при использовании th:object, используйте вместо него th:field. И ваш контроллер немного отличается от того, что я видел обычно. Я бы рекомендовал изменить его на следующий код.

Форма

<form th:action = "@{/quotes/save}" th:object = "${quote}">
    <input type = "text" th:field = "*{primary.lastName}" />
    <input type = "text" th:field = "*{primary.firstName}" />
</form>

Контроллер

@PostMapping("/quotes/save")
public String save(@ModelAttribute Quote quote, BindingResult bindingResult) {
        quote.getPrimary(); // this contains a Person object... as expected
        quote.getSecondary(); // this also contains a Person object... which is NOT EXPECTED
        ...
    }
}

Да, я уже использовал th: field, но использовал имя, чтобы быть понятным в моем примере. Я добавил @ModelAttribute с моим @Validated ({...}), но вторичный атрибут все еще создается по какой-то причине.

djmistral 07.11.2018 23:38

У них такая же информация? Или это два разных человека?

Alain Cruz 07.11.2018 23:40

primary имеет lastName и firstName, заполненные из формы. вторичный создается, но значения не заданы. Я также должен отметить, что я просмотрел все параметры запроса после отправки, и в них нет ничего, что даже содержало бы «второстепенные».

djmistral 07.11.2018 23:46

Я считаю, что это связано с аннотациями @Valid и @Validate. Возможно, где-то вы установили значение по умолчанию для своего второго человека, что затем предотвратило его отправку как нулевое значение. Можно попробовать, убрав аннотацию @Validate? Кроме того, когда вы имеете в виду отсутствие набора значений, вы имеете в виду, что каждая строка имеет значение NULL?

Alain Cruz 07.11.2018 23:56

Другие вопросы по теме