У меня есть класс 2, который отображается в спящем режиме.
1. Класс реализует счет
2. Класс реализует тип учетной записи.
Важная информация! Одна учетная запись может иметь несколько типов.MVC и объект с набором <>
Account.class
@Entity
@Table(name = "dp_account",
uniqueConstraints={@UniqueConstraint(columnNames={"id"})})
public class Account {
@Id
@Column(name="id", nullable = false, unique = true, length = 11)
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "price", nullable = false)
private int price;
@Column(name = "customer_id", nullable = false, unique = true, length = 11)
private long customerId;
@Column(name = "customer", length = 100, nullable = false, unique = true)
private String customer;
@Column(name = "comment", length = 1000)
private String comment;
@Column(name = "date", columnDefinition="TIMESTAMP")
@Temporal(TemporalType.TIMESTAMP)
private Date date;
@Column(name = "is_deleted", nullable = false)
private boolean deleted = false;
@ManyToMany(fetch = FetchType.EAGER, targetEntity = AccountType.class, cascade = { CascadeType.ALL })
@JoinTable(name = "account_accountType",
joinColumns = { @JoinColumn(name = "account_id") },
inverseJoinColumns = { @JoinColumn(name = "type_id") })
private Set<AccountType> accountTypes;
// дальше конструкторы и геттеры/сеттеры
}
Суть типа учетной записи, которая имеет имя, описание, идентификатор и имя владельца.
AccountType.class
@Entity
@Table(name = "account_type")
public class AccountType {
private static final Long serialVersionUID = -4727727495060874301L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "name", length = 25, nullable = false, unique = true)
private String name;
@Column(name = "description", length = 255)
private String description;
@Column(name = "user_login", length = 45, nullable = false, unique = true)
private String login;
//дальше геттеры/сеттеры и конструкторы
}
Возникает вопрос - есть страница, где я заполнить форму, чтобы создать учетную запись (Account.class
), я multiple select
, чтобы заполнить типы счетов (AccountType.class
). У Account.class есть поле Set<AccountType> accountTypes
, где каждая учетная запись содержит список типов. (Это список, который я пытаюсь заполнить, а затем передать Account.class в MVC-контроллере). Но в контроллере я даже не получаю ошибку 400. После многочисленных тестов я понял, что Spring MVC не привязывает мой список. Я хотел бы знать, как это сделать? Контроллер
MVC:
@RequestMapping(value = "/account/addAccount", method = RequestMethod.POST)
public void addAccount(@ModelAttribute("accountAttribute") Account account) {
System.out.println("Account on the top");
System.out.println(account);
ServiceFactory.getInstance().getAccountService().addAccount(account);
}
JSP:
<div style="margin-top: 40px">
<form:form action="${pageContext.request.contextPath}/account/addAccount" method="post" modelAttribute="accountAttribute">
<label>
Сумма: <input type="number" name="price">
</label>
<br> <br>
<label>
Категория:
<select multiple name="accountTypes">
<c:forEach items="${accountTypes}" var="accountType">
<option value="${accountType.name}">${accountType.name}</option>
</c:forEach>
</select>
</label>
<br><br>
<label>Комментарий:
<br> <br>
<textarea name="comment" rows="5" cols="30"></textarea>
</label>
<br><br>
<input type="submit" value="Внести">
</form:form>
</div>
ОБНОВЛЕНИЕ:
@RequestMapping(value = "/welcome", method = RequestMethod.GET)
public ModelAndView welcomePage() {
ModelAndView model = new ModelAndView();
List<GrantedAuthority> grantedAuthorityList = (List<GrantedAuthority>) SecurityContextHolder.getContext().getAuthentication().getAuthorities();
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String login = authentication.getName();
if (grantedAuthorityList.contains(new SimpleGrantedAuthority("ROLE_ADMIN"))) {
model.setViewName("admin");
} else {
List<AccountType> accountTypes = ServiceFactory.getInstance().getAccountService().getAllAccountTypeByLogin(login);
model.addObject("accountTypes", accountTypes);
model.setViewName("user");
}
return model;
}
спасибо за ваш ответ, но когда я использую свое решение. У меня проблема «java.lang.IllegalStateException: ни BindingResult, ни обычный целевой объект для bean name« accountAttribute », доступный как атрибут запроса» – GermanSevostyanov
Это потому, что, возможно, вы не добавили атрибут accountAttribute к модели контроллера, которая возвращает, страницу, которую вы прикрепляли как скриншот. –
Зайдите в мой пост-контроллер MVC. Я думаю, что я добавил accountAttribute. Я ошибаюсь? – GermanSevostyanov