Printemps de téléchargement de fichiers ne lie pas le modèle de l'attribut de l'objet

Je veux construire un simple fichier de téléchargement fonctionnalités à l'aide de Spring MVC.

J'ai le multipartResolver en place et de travail:

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

Lors du téléchargement d'un fichier c'est connecté:

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]

qui me dit que c'est fondamentalement de travail.

Cela fait partie de ma 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>

C'est mon modèle attribut de classe de l'objet:

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

Et cela fait partie de ma méthode de Contrôleur:

@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();
}

Ce qui se passe, c'est que les imageUpload attribut de l'objet de formulaire n'est pas rempli (null), alors que toutes les autres propriétés sont.

J'ai trouvé que cela fonctionne quand je l'utilise dans le contrôleur:

@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();
}

Ainsi, le MultipartFile comme un @RequestParam œuvres, mais qui le lie à la forme du modelAttribute objet qui ne fonctionne pas. J'ai trouvé des centaines d'exemples sur le web que faire au sujet de la même et je ne trouve pas la différence.

Je suis encore à apprendre le Printemps, donc je risque de manquer une très évident. Je pourrais simplement utiliser la deuxième version de la manette, mais je ne le comprends pas, et comme je l'ai dit, je suis d'apprentissage.

Ne devrait pas toutes les <form:input path="abc"> propriétés à l'intérieur de la <form:form modelAttribute="xyz">...</form:form> être lié à xyz.abc? Il fonctionne comme ceci pour toutes les propriétés à l'exception du téléchargement d'un fichier.

Des idées?
Grâce

InformationsquelleAutor marc82ch | 2013-07-21