2016-12-06 94 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); 
    } 
}