当前位置: 首页 > 知识库问答 >
问题:

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

沈骞仕
2023-03-14

我有这张表格

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

在我的模型中,我决定不将文件字段定义为multipartfile,而是使用string

我这样做是为了让我能够抓取上传的文件文件名,并离开spring mvc上传文件。这是可行的,但当我引入错误检查时,我会得到以下错误:

org.springframework.validation.beanpropertybindingresult:1错误字段“file”上对象“customer”中的字段错误:拒绝值[org.springframework.web.multipart.support.standardmultipartttpservletrequest$standardmultipartfile@2a8400bb];代码[typeMismatch.customer.file,typeMismatch.file,typeMismatch.java.lang.String,typeMismatch];参数[org.springframework.context.support.defaultmessageSourceResolvable:代码[customer.file,file];参数[];default message[file]];默认消息[无法将类型[org.springframework.web.multipart.support.standardmultipartttpservletrequest$standardmultipartfile]的属性值转换为属性“file”的必需类型[java.lang.String];嵌套异常为java.lang.IllegalStateException:无法将类型[org.springframework.web.multipart.support.standardmultipartttpservletrequest$standardmultipartfile]的值转换为属性“file”的必需类型[java.lang.String]:找不到匹配

我的控制器:

@RequestMapping(value = "/saveCustomer", method = RequestMethod.POST)
public String saveCustomer(@Valid FileBucket fileBucket,
        ModelMap model, @ModelAttribute("customer") Customer theCustomer,BindingResult result) throws IOException {

    if (result.hasErrors()) {
        System.out.println("validation errors");
        return "customer-form";
    } else {
        System.out.println("Fetching file");
        MultipartFile multipartFile = fileBucket.getFile();

        // Now do something with file...
        FileCopyUtils.copy(fileBucket.getFile().getBytes(), new File( UPLOAD_LOCATION + fileBucket.getFile().getOriginalFilename()));
        String fileName = multipartFile.getOriginalFilename();
        model.addAttribute("fileName", fileName);
        theCustomer.setFile(fileName);
        customerService.saveCustomer(theCustomer);  
        return "redirect:/customer/list";
    }
}

我如何处理这个错误?

共有2个答案

阚砚文
2023-03-14

我创建了另一个名为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;

这招奏效了。

魏学智
2023-03-14

在您的错误部分只说这一点

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是客户前端its和文件输入,后端是字符串,所以您有问题

Private String File是不正确的参数,因为它是多部分数据,所以您应该在实体类中使用MultipartFile

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

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

  //getters setters

 }
 类似资料:
  • 我在研究“头先Java”中的多态性,并由此产生了这个概念。谁能举个例子解释一下吗? 编译器检查引用类型的类,而不是对象类型。 那么引用类型和对象类型之间有什么区别呢?

  • 问题内容: 在Java中,序列化对象非常容易。在C 中 ,只要对象像C结构一样就安全(?)(无多态性)。在C 中, 如果编译器能够生成默认的(琐碎的)复制构造函数,那么为什么它不能生成用于自动序列化的代码? 在Java中,只能从ctor访问静态函数和数据成员。 在C ++中,我可以愉快地使用ctor中的非静态成员和函数。 在Java中,我可以在类中内联初始化数据成员。在C ++中,这是一个编译错误

  • 我不习惯用口水和口水 我部署了一个服务于业务规则的tomcat服务器 问题是,如果我使用与服务器类型DRL或PKG相反的代码,我会得到两个不同的答案 如果我反对DRL类型的服务器,我会得到一个结果 http://localhost:8180/guvnor/org.drools.guvnor.Guvnor/package/PkgDinamicoBV/LATEST.drl 属性名称="type"val

  • 这两者有什么区别?基元类型不能有“类”,可以吗?它是基元类型。没有对象具有类。 这两者有什么不同?

  • 我有一个包含类型字段的实体类。这些值是我不允许修改的,但是当使用Spring数据时,我需要将它们映射到我的model类中,这样在将文档保存回Mongo后,这些值就不会丢失。因此从Mongo获取文档,映射到POJO,然后传递给Thymeleaf表单。当我尝试将Thymeleaf表单发送回控制器时,我收到了400个错误的请求“对象的验证失败...”错误,我知道这是因为这两个附加的字段。我如何将这些字段

  • 我有来自API的响应文本。当我试图创建一个新的游戏从这个响应我得到一个错误: 错误:未处理的异常:“列表”类型不是“列表”类型的子类型 我在尝试使用JSON文本时遇到如下错误: 错误: 未处理的异常:“列表”类型不是“列表”类型的子类型 它指向游戏类中的这一行: 有什么建议吗?