Przesyłanie plików wiosennych nie wiąże się z obiektem atrybutu modelu

Chcę zbudować prostą funkcję przesyłania plików za pomocą Spring MVC.

Mam wieloczęściowy serwer działający i działający:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <property name="maxUploadSize" value="10240000"/>
</bean>

Podczas przesyłania pliku jest to rejestrowane:

DEBUG:[org.springframework.web.multipart.commons.CommonsMultipartResolver]: Found multipart file [imageUpload] of size 29081 bytes with original filename [xyz.jpg], stored at [/home/myuser/workspace/myProject/target/tmp/upload_67f1107c_1b8f_402c_bebd_6cd8a6e4c830_00000032.tmp]

co mówi mi, że w zasadzie działa.

To jest część mojego JSP:

<form:form modelAttribute="placeForm" action="/platz/save" method="post" cssClass="placeForm" enctype="multipart/form-data">
...
        <label for="imageUpload">Upload</label>
        <form:input type="file" path="imageUpload" id="imageUpload" accept="image/*" />
...
</form:form>

To jest klasa obiektu mojego atrybutu modelu:

public class PlaceEditForm
{
    @Valid
    private Place place = new Place();
    private Map<Integer, PlaceFeature> features;
    private MultipartFile imageUpload;
... getter/setter omitted...
}

I to jest część mojej metody kontrolera:

@RequestMapping(value="/save", method=RequestMethod.POST)
public String savePlace (@Valid @ModelAttribute("placeForm") PlaceEditForm form, BindingResult result)
{
    logger.debug("saveNewPlace");
    logger.debug("Upload: "+form.getImageUpload()); // null
    ...
    return "redirect:/platz/"+place.getPlaceId();
}

Co się dzieje, że atrybut imageUpload obiektu formularza nie jest wypełniony (null), podczas gdy wszystkie inne właściwości formularza to.

Odkryłem, że działa, gdy używam tego w kontrolerze:

@RequestMapping(value="/save", method=RequestMethod.POST)
public String savePlace (@Valid @ModelAttribute("placeForm") PlaceEditForm form, BindingResult result, @RequestParam("imageUpload") MultipartFile upload, BindingResult uploadResult)
{
    logger.debug("saveNewPlace");
    logger.debug("Upload: "+upload); // Works!!
    ...
    return "redirect:/platz/"+place.getPlaceId();
}

Tak więc posiadanie MultipartFile jako@RequestParam działa, ale wiąże go z formąmodelAttribute obiekt nie. Znalazłem setki przykładów w sieci, które robią to samo i nie znajduję różnicy.

Nadal uczę się Springa, więc mogę przegapić bardzo oczywisty punkt. Mógłbym po prostu użyć drugiej wersji kontrolera, ale nie rozumiem tego i, jak powiedziałem, uczę się.

Nie wszystkie powinny<form:input path="abc"> właściwości wewnątrz<form:form modelAttribute="xyz">...</form:form> być zobowiązanym doxyz.abc? Działa tak w przypadku wszystkich właściwości z wyjątkiem przesyłania plików.

Jakieś spostrzeżenia? Dzięki

questionAnswers(1)

yourAnswerToTheQuestion