2016-12-06 81 views
0

你好複雜的對象進行,所以我不得不2個實體如何與POST請求

主要實體

@Entity 
@Table(name = "Events") 
public class Event { 

//Some fields ... 

@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(name = "event_eventtypes" , 
     joinColumns = @JoinColumn(name = "event_id"), 
inverseJoinColumns = @JoinColumn(name = "event_type_id")) 
private Set<EventType> eventTypes; 

//Getters and setters... 

現在我有一個使用彈簧表單標籤庫

創建的窗體
<form:form modelAttribute="event" method="post" action="/event/registerEvent" commandName="event"> 

<form:label path="name">Event display name</form:label> 
<form:input path="name" type="text" cssClass="form-control" placeholder="Display name"/> 

<form:label path="description" >Description</form:label> 
<form:textarea path="description" cssClass="form-control"/> 

<form:label path="priv" cssClass="">Make private? <span style="font-family:'Open Sans', sans-serif; font-size:11px; color: dodgerblue;">(It will be seen by your friends and people who you send invitation.)</span></form:label>  
<form:checkbox path="priv" cssClass="form-check-input"/> 

<form:label path="age">Age limit</form:label> 
<form:select path="age"> 
    <form:options items="${age}"/> 
</form:select> 


<form:hidden path="lng" id="formLang" /> 
<form:hidden path="lat" id="formLat"/> 
<%--Question appear here--%> 
<form:select path="eventTypes" items="${eventTypes}" multiple="true"/> 

<input type="submit" value="Submit"> 

控制器

@Controller 
public class EventController { 

    private static final Logger logger = LoggerFactory.getLogger(EventController.class); 

    @Autowired 
    private EventService eventService; 
    @Autowired 
    private UserService userService; 
    @Autowired 
    private EventTypeService eventTypeService; 

    @RequestMapping(path = "/event/create", method = RequestMethod.GET) 
    public String init(ModelMap modelMap) { 
     List<String> tags = eventTypeService.listEventTypes().stream().map(EventType::getName).collect(Collectors.toList()); 
     ArrayList<Integer> ageArr = new ArrayList(); 
     ageArr.add(0); 
     ageArr.add(6); 
     ageArr.add(12); 
     ageArr.add(16); 
     ageArr.add(18); 
     modelMap.addAttribute("event", new Event()); 
     modelMap.addAttribute("age", ageArr); 
     modelMap.addAttribute("eventTypes", tags); 
     return "/event/create"; 
    } 

    @RequestMapping(path = "/event/registerEvent", method = RequestMethod.POST) 
    public String createEvent(@ModelAttribute("event") Event event, @ModelAttribute("eventTypes1") List<String> eventTypes){ 
     event.setDate(new Date()); 
     event.setUser(userService.getUserByUsername(
      AuthenticationService.getLoggedInUser()) 
     ); 
     eventService.addEvent(event); 

     return "redirect:/"; 
    } 

當值的完整形式,點擊提交,得到錯誤

400通過客戶端發送的請求是語法不正確。

這是因爲eventTypes屬性是String類型。我怎麼能發送該列表作爲控制器中的另一個參數或我應該怎麼做?

回答

0

找到了結果。 只實現基於JSP的形式:

<form:form modelAttribute="event" method="post" action="/event/registerEvent" commandName="event"> 

    ... 

    <%--There I'm not using more jsp tabs.--%> 
    <select multiple name="et" id="tags"> 
     <c:forEach items="${eventTypes}" var="e"> 
      <option value=${e}>${e}</option> 
     </c:forEach> 
    </select> 

    <input type="submit" value="Submit"> 
</form:form> 

在控制器我得到參數request.getParameterValues("et")) - 從HttpServletRequest的

返回 String[]
0

也許你需要一個DTO來包含event和eventType列表。

0

當我這樣做時,我發送一個帶有事件類型ID /字符串列表的DTO到表單,然後從DTO創建一個新事件。

對於select語句循環查找DTO中返回的每個選項,並使用服務findById檢索每個eventType,然後將其添加到事件模型中。

for (String tag : eventDTO.getEventTags()) { 

    EventType eventTag = eventTypeService.findById(Long.valueOf(tag)); 

    if (eventTag != null) { 
     event.getEventTypes().add(eventTag); 
    } 
}