Spring mvc处理表单和模型之间的类型差异

时间:2017-12-18 10:38:35

标签: java spring spring-mvc

我有这个表格

Resource

和这个模型

<form:form action="saveCustomer" modelAttribute="customer" enctype="multipart/form-data" method="POST">

            <!-- need to associate this data with customer id -->
            <form:hidden path="id" />

            <table>
                <tbody>
                    <tr>
                        <td><label>First name:</label></td>
                        <td><form:input path="firstName" /></td>
                    </tr>

                    <tr>
                        <td><label>Last name:</label></td>
                        <td><form:input path="lastName" /></td>
                    </tr>

                    <tr>
                        <td><label>Email:</label></td>
                        <td><form:input path="email" /></td>
                    </tr>
                    <tr>
                    <td><label>Profile Image:</label></td>
                        <td>
                        <form:input type="file" path="file" id="file" class="form-control input-sm"/>
                        </td>
                    </tr>

                    <tr>
                        <td><label></label></td>
                        <td><input type="submit" value="Save" class="save" /></td>
                    </tr>

                </tbody>
            </table>    
        </form:form>

在我的模型中,我决定不将文件字段定义为@Entity @Table(name="customer") public class Customer { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") private int id; @Column(name="first_name") private String firstName; @Column(name="last_name") private String lastName; @Column(name="email") private String email; @NotEmpty @Column(name="file") private String file; ,而是使用字符串。

我这样做是为了让我只需抓取上传的文件名并留下spring mvc上传文件。这有效,但当我引入错误检查时,我收到此错误

  

org.springframework.validation.BeanPropertyBindingResult:1个错误   字段'file'上对象'customer'中的字段错误:被拒绝的值   [org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@2a8400bb];   代码   [typeMismatch.customer.file,typeMismatch.file,typeMismatch.java.lang.String,typeMismatch];   参数   [org.springframework.context.support.DefaultMessageSourceResolvable:   代码[customer.file,file];参数[];默认消息[file]];   默认消息[无法转换类型的属性值   [org.springframework.web.multipart.support.StandardMultipartHttpServletRequest $ StandardMultipartFile]   要求属性'file'的类型[java.lang.String];嵌套   异常是java.lang.IllegalStateException:无法转换值   类型   [org.springframework.web.multipart.support.StandardMultipartHttpServletRequest $ StandardMultipartFile]   要求属性'file'的类型[java.lang.String]:没有匹配   编辑或转换策略发现]

在我的控制器中我有这段代码

MultipartFile

我该如何处理这个错误?。

2 个答案:

答案 0 :(得分:0)

在你的错误部分只说这个

  

typeMismatch.customer.file,typeMismatch.file,typeMismatch.java.lang.String,typeMismatch

但在实体类文件中是一个字符串

 <form:form action="saveCustomer" modelAttribute="customer" enctype="multipart/form-data" method="POST">

以您的形式

<form:input type="file" path="file" id="file" class="form-control input-sm"/> 

但是,在这里你的modelAttribute是客户前端的文件输入和后端它是String以便你有问题

private String file是不正确的参数,因为它是一个多部分数据,因此您应该在实体类中使用MultipartFile

 @Entity
 @Table(name="customer")
 public class Customer {

  ... . .  . . .. 
  private MultipartFile file;

  //getters setters

 }

答案 1 :(得分:0)

我创建了另一个名为path的字段,并使file瞬态

@Entity
@Table(name="customer")
public class Customer {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    @Column(name="first_name")
    private String firstName;

    @Column(name="last_name")
    private String lastName;

    @Column(name="email")
    private String email;

    @NotEmpty
    @Column(name="path")
    private String path;

    @Transient
    private MultipartFile file;

并且有效。