2016-12-06 2 views
0

Hallo SO hatte ich 2 EinheitenWie mit komplexen Objekt in POST-Anfrage

Haupteinheit

@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... 

Jetzt habe ich eine Form, um fortzufahren, die Feder erstellt wird form taglib

<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

@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:/"; 
    } 

Wenn vollständiger Form mit Werten, senden klicken, erhalten Fehler

400 Die Anfrage vom Client gesendet wurde syntaktisch falsch.

Dies liegt daran, dass die eventTypes-Eigenschaft vom String-Typ ist. Wie kann ich diese Liste als einen anderen Parameter im Controller senden oder was soll ich tun?

Antwort

0

Gefunden soulution. Nur jsp-basiertes Formular implementieren als:

<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> 

Kontroller I Parameter wie request.getParameterValues("et")) erhalten - die String[] von HttpServletRequest

zurückkehren
0

Möglicherweise benötigen Sie ein DTO, um sowohl die Ereignis- als auch die Ereignistypliste einzubeziehen.

0

Wenn ich dies getan habe, sende ich ein DTO mit einer Liste von IDs/Strings für Ereignistypen an das Formular und erstellen Sie dann ein neues Ereignis aus dem DTO.

Für die SELECT-Anweisungen eine Schleife um jede im DTO zurückgegebene Option ausführen und einen Service findById verwenden, um jeden eventType abzurufen und dann zum Ereignismodell hinzuzufügen.

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

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

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