Форма портлета Spring: @ModelAttribute не заполнен

Я новичок в Spring, и мне было интересно, почему мой ModelAttribute не заполняется (все значения были нулевыми)

Я хочу создать составную часть, которая позволяет мне загружать CSV-файл, а также тип CSV-файла.

Мои коды такие:

В файле CSVUpload-portlet.xml:

<bean class="org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter">

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

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

CSVUploadPortlet.java (контроллер)

*All imports 

@Controller("uploadCsvToDatabase")
@RequestMapping(value = "VIEW")
public class CSVUploadPortlet {
  private static final Logger log = Logger.getLogger(CSVUploadPortlet.class);
  private static IWBCSVUploadRemote csvupload;

  @RenderMapping
  public String viewCSVUploadBase(Model model, RenderRequest request) {
    try {

    } catch (Exception e) {
      e.printStackTrace();

      log.info("problem in retrieving the CSV Upload service" + e);
    }
    return "csvupload/csvupload_view";
  }

  @ModelAttribute("csvFileUploadVO")
  public CSVFileUploadVO getCommandObject() 
  {
    System.out.println("SpringFileController -> getCommandObject -> Building VO");
    return new CSVFileUploadVO();
  }

  @ActionMapping(params="action=uploadCsvToDatabase")
  public void uploadCsvToDatabase(
      @ModelAttribute("csvFileUploadVO") CSVFileUploadVO csvFileUploadVO, BindingResult result, ActionRequest request, ActionResponse response, SessionStatus sessionStatus){
    try{
      System.out.println("FileType:"+csvFileUploadVO.getFileType()); //This returns null
      System.out.println("CSVFile Size:"+csvFileUploadVO.getCsvFile().getSize());  //This returns a null-pointer exception
    } catch (Exception e) {
      log.info("Problem in retrieving the CSVUpload configuration list " + e);
      e.printStackTrace();
    }
  }
}

CSVFileUploadVO.java

import org.springframework.web.multipart.commons.CommonsMultipartFile;

public class CSVFileUploadVO {
  private String fileType;
  private CommonsMultipartFile csvFile;
  private String message;

  public CSVFileUploadVO() {
  }

  public String getFileType() {
    return fileType;
  }

  public void setFileType(String fileType) {
    this.fileType = fileType;
  }

  public String getMessage() {
          return message;
  }

  public void setMessage(String message) {
          this.message = message;
  }

  public CommonsMultipartFile getCsvFile() {
          return csvFile;
  }

  public void setCsvFile(CommonsMultipartFile csvFile) {
          this.csvFile = csvFile;
  }
}

Форма JSP

All taglibs imported...
<portlet:actionURL var="fileUploadURL">
    <portlet:param name="action" value="uploadCsvToDatabase" />
</portlet:actionURL>

<form:form method="post" action="${fileUploadURL}"
    commandName="csvFileUploadVO" enctype="multipart/form-data">
    <table>
        <tbody>
            <tr>
                <td><label>Department:</label></td>
                <td><form:select path="fileType">
                        <form:option value="BRMAdd" label="BRM Add" />
                        <form:option value="FOSAdmin" label="FOS Admin" />
                        <form:option value="FOSRM" label="FOS RM" />
                        <form:option value="FOSTeam" label="FOS Team" />
                        <form:option value="ITRelationships" label="IT Relationships" />
                        <form:option value="HRAttendance" label="HR Attendance" />
                        <form:option value="iCareCallReport" label="iCare Call Report" />
                    </form:select></td>
            </tr>
            <tr>
                <td><label>Specify your File:</label></td>
                <td><form:input path="csvFile" type="file" /></td>
            </tr>
            <tr>
            <tr>
                <td colspan="100%"><input type="submit" value="Submit" /></td>
            </tr>
            <tr>
                <td colspan="100%">${csvFileUploadVO.message}</td>
            </tr>
        </tbody>
    </table>
</form:form>

Я знаю, что это похоже на просьбу помочь решить проблему для меня, но я застрял на этом в течение 8 часов, читая все ресурсы и веб-сайты stackoverflow, которые я мог найти в Google. Но, несмотря на это, я ничего не смог найти.

Спасибо за вашу помощь в этом.


person puissant    schedule 12.09.2012    source источник


Ответы (4)


Вы можете посмотреть на http://static.springsource.org/spring/docs/3.0.x/reference/mvc.html#mvc-multipart-resolver особенно RequestMapping, где параметр MultipartFile

@RequestMapping(value = "/form", method = RequestMethod.POST)
  public String handleFormUpload(@RequestParam("name") String name,
    @RequestParam("file") MultipartFile file) {
person M Smith    schedule 20.09.2012

Вы должны определить ModelAttribute в своей JSP-форме, примерно так:

<form:form method="post" action="${fileUploadURL}"
modelAttribute="csvFileUploadVO" enctype="multipart/form-data">
person elcadro    schedule 13.02.2013

Liferay 6.0.5 и Spring 3.2.2.РЕЛИЗ:

Я пытался редактировать классы Spring, но есть гораздо более простое решение этой проблемы. Просто проверьте, действительно ли ваш CommonsPortletMultipartResolver был инициализирован. То, что он объявлен в spring.xml, не означает, что он загружен.

Если он не инициализирован, то файловая часть запроса никогда не будет преобразована в CommonsMultipartFile, потому что ваш запрос не будет запросом Commons Multipart.

CommonsPortletMultipartResolver будет вызываться жизненным циклом org.springframework.web.portlet.DispatcherPortlet, если он загружен и Spring использует этот класс.

person user2436114    schedule 30.05.2013
comment
Существует гораздо более простое решение этой проблемы, не нужно перезаписывать классы Spring. Проверьте, действительно ли ваш CommonsPortletMultipartResolver был инициализирован. Если он не инициализирован, то файловая часть запроса никогда не будет преобразована в CommonsMultipartFile, потому что ваш запрос не будет запросом Commons Multipart. - person user2436114; 06.06.2013

Ваш составной распознаватель должен иметь идентификатор portletMultipartResolver и быть типа org.springframework.web.portlet.multipart.CommonsPortletMultipartResolver.

<bean id="portletMultipartResolver" class="org.springframework.web.portlet.multipart.CommonsPortletMultipartResolver">
</bean>
person Ramsés Corporales Rodríguez    schedule 19.12.2017