Spring MVC 无法将MultipartFile类型的值转换为字符串

7uzetpgm  于 2022-11-14  发布在  Spring
关注(0)|答案(2)|浏览(115)

为字段Name添加验证时出现错误:
对象='item'的验证失败。错误计数:对象'item'中的字段'image'上出现字段错误:已拒绝java.lang.非法状态异常:无法将类型“org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile”的值转换为属性“image”所需的类型“java.lang.String”:找不到匹配的编辑器或转换策略
实体、类物料

@Entity
@Table(name = "items")
public class Item {

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

@NotBlank(message = "Введите наименование")
@Column(name = "name")
private String name;

@JsonIgnore
@Lob
@Column(name = "image")
private String image;
}

主控制器

@PostMapping("/items")
public String add(
    @Valid Item item,
    @RequestParam("image") MultipartFile file,
    BindingResult bindingResult,
    Model model
) throws IOException {

if (bindingResult.hasErrors()){
    Map<String, String> errorsMap = ControllerUtils.getErrors(bindingResult);
    model.mergeAttributes(errorsMap);
    model.addAttribute("item", item);
} else {
    if (file != null && !file.getOriginalFilename().isEmpty()) {
        byte[] data = file.getBytes();
        String imageString = Base64.getEncoder().encodeToString(data);
        item.setImage(imageString);
    }
    model.addAttribute("item", null);
    itemService.saveItem(item);
}
1l5u6lss

1l5u6lss1#

我通过创建新的formParams(非常类似于带有所有验证参数的实体Items)并将此表单作为post方法的参数来解决这个问题。

@PostMapping("/items/save")
public String add(@AuthenticationPrincipal User user, @Valid ItemInputParams formParams,
                  BindingResult bindingResult, Model model) throws IOException {

    if (bindingResult.hasErrors()){
        Map<String, String> errorsMap = 
ControllerUtils.getErrors(bindingResult);
        model.mergeAttributes(errorsMap);
        model.addAttribute("item", formParams);
        return initItems(null, model);
    }

    Item item = new Item();
    item.setName(formParams.getName());
    (...)

    MultipartFile file = formParams.getImage();
    if (file != null && !file.getOriginalFilename().isEmpty()) {
        byte[] data = file.getBytes();
        String imageString = Base64.getEncoder().encodeToString(data);
        item.setImage(imageString);
    }
    (...)
}
67up9zun

67up9zun2#

确保表单开始标记中有一个enctype,并确保request参数中的名称与表单和数据库字段中的名称相同

相关问题