2016-03-10 3 views
1

У меня есть класс 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; 
    } 

ответ

1

При использовании т он HTML выберите элемент, но то, что вам нужно сделать, это выбрать то есть использовать родниковую тег библиотеки:

<form:select path="accountTypes" multiple="true"> 
    <form:options items="${accountTypes}"/> 
</form:select> 

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

Попробуйте использовать этот

@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"); 
//Add here 
model.addObject("accountAttribute", new Account()); 
    } 
    return model; 
} 
+0

спасибо за ваш ответ, но когда я использую свое решение. У меня проблема «java.lang.IllegalStateException: ни BindingResult, ни обычный целевой объект для bean name« accountAttribute », доступный как атрибут запроса» – GermanSevostyanov

+0

Это потому, что, возможно, вы не добавили атрибут accountAttribute к модели контроллера, которая возвращает, страницу, которую вы прикрепляли как скриншот. –

+0

Зайдите в мой пост-контроллер MVC. Я думаю, что я добавил accountAttribute. Я ошибаюсь? – GermanSevostyanov

0

Вопрос в том, что вам нужно зарегистрировать редактор свойств или конвертер, который способен преобразовывать ваши имена типов учетных записей к объекту ВидСчет. Ваше представление отправляет строковое значение для элемента accountTypes. Spring должен знать, как привязать значение String к объекту.

public class AccountTypeEditor extends PropertyEditorSupport{ 

    public void setAsText(String text){ 
     AccountType accountType = // some logic to find account type by name 
     setValue(accountType); 
    } 
} 

В контроллере вам нужен метод @InitBinder зарегистрировать ваш редактор

@InitBinder 
public void initBinder(WebDataBinder binder){ 
    binder.registerCustomEditor(AccountType.class , new AccountTypeEditor()); 
} 

}

+0

, спасибо, я постараюсь сделать так, как вы сказали – GermanSevostyanov

+0

Я смог решить проблему, если заинтересованный может посмотреть. Я сделал ответ – GermanSevostyanov

0

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

JSP:

<form:form action="${pageContext.request.contextPath}/account/addAccount" method="post" modelAttribute="accountAttribute"> 

       <label> 
        Сумма: <input type="number" name="price"> 
       </label> 
       <br> <br> 

       <select multiple name="accountTypeNameSet" size="4s"> 
        <c:forEach items="${accountTypes}" var="accountType"> 
         <option >${accountType}</option> 
        </c:forEach> 
       </select> 

       <label>Комментарий: 
        <br> <br> 
        <textarea name="comment" rows="5" cols="30"></textarea> 
       </label> 
       <br><br> 

       <input type="submit" value="Внести"> 

      </form:form> 

Контроллер:

@RequestMapping(value = "/account/addAccount", method = RequestMethod.POST) 
    public void addAccount(@ModelAttribute("accountAttribute") Account account, @RequestParam(value="accountTypeNameSet") Set<String> accountTypeNameSet) { 
    // implementation here 
// accountTypeNameSet - This is the list of names account type, which user selected. On the basis of these names we can pull your invoice from database. 
Смежные вопросы