У меня проблема, когда создается дочерний объект, хотя моя форма не указывает, что он должен быть создан. Проблема, которую я получаю, заключается в том, что при отправке формы возникают ошибки поля проверки, в которых указано, что фамилия и имя вторичного пользователя отсутствуют.
В идеале я хочу, чтобы вторичное значение оставалось нулевым и, следовательно, не проверялось при отправке формы.
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
...
}
}
Не используйте имя при использовании 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
...
}
}
У них такая же информация? Или это два разных человека?
primary имеет lastName и firstName, заполненные из формы. вторичный создается, но значения не заданы. Я также должен отметить, что я просмотрел все параметры запроса после отправки, и в них нет ничего, что даже содержало бы «второстепенные».
Я считаю, что это связано с аннотациями @Valid и @Validate. Возможно, где-то вы установили значение по умолчанию для своего второго человека, что затем предотвратило его отправку как нулевое значение. Можно попробовать, убрав аннотацию @Validate? Кроме того, когда вы имеете в виду отсутствие набора значений, вы имеете в виду, что каждая строка имеет значение NULL?
Да, я уже использовал th: field, но использовал имя, чтобы быть понятным в моем примере. Я добавил @ModelAttribute с моим @Validated ({...}), но вторичный атрибут все еще создается по какой-то причине.