Spring mvc 在spring mvc中使用模型字段获取文件

Spring mvc 在spring mvc中使用模型字段获取文件,spring-mvc,file-upload,Spring Mvc,File Upload,我正在尝试为模型添加一个包含其他字段的文件,但无法将该文件与这些字段绑定。 处理请求 @RequestMapping(value="/products", method=RequestMethod.POST) public String saveProduct(@Valid @ModelAttribute("product") Product product, BindingResult result){ if (result.hasErrors()) { retu

我正在尝试为模型添加一个包含其他字段的文件,但无法将该文件与这些字段绑定。 处理请求

@RequestMapping(value="/products", method=RequestMethod.POST)
    public String saveProduct(@Valid @ModelAttribute("product") Product product, BindingResult result){
    if (result.hasErrors()) {
       return "manageProduct";
    }
}
在模型类中使用其他一些字段

@Entity
public class Product {

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

private String code;

@NotBlank(message = "Product name can't be blank")
private String name;

@NotBlank(message = "Brand name can't be blank")
private String brand;

@NotBlank(message = "Description can't be blank.")
@Size(min = 10, max = 500, message = "Description shoud be contain 10 and 500 characters")
@JsonIgnore
private String description;

@Min(value = 1)
@Column(name = "unit_price")
private float unitPrice;

private int quantity;

@JsonIgnore
@Column(name = "is_active")
@OrderBy("id ASC")
private boolean active;

@Column(name = "category_id")
@JsonIgnore
private int categoryId;

@Column(name = "supplier_id")
@JsonIgnore
private int supplierId;

private int purchases = 0;

private int views = 0;

@Transient
private MultipartFile file;

//getters and setters
}
表单也包含enctype=“多部分/表单数据”,方法为“post”。 当尝试上载带有其他字段的文件时,会发生错误。
我使用的是spring boot。

假设您使用的是spring数据,然后JPA提供了一个上传内容并将内容与实体关联的解决方案

当您使用SpringBoot时,很容易添加。添加以下依赖项:

pom.xml

创建
ContentStore
(相当于blob的JpaRepository):

ProductContentStore.java

@StoreRestResource(path=“productsContent”)
公共接口ProductContentStore扩展了ContentStore{
}
运行应用程序时,Spring内容将看到
ProductContentStore
接口和
Spring内容jpa
依赖项,并为您注入此接口的jpa实现,这意味着您不必自己编写此接口。它还将看到
spring内容rest
依赖关系,并添加@Controller实现,该实现将GET、PUT、POST和DELETE rest请求转发到
ProductContentStore
bean,这意味着您也不必编写此控制器。REST端点将在
/productsContent
上可用,因此

创建产品并获得ID后,您可以:

curl-xpost-F“image=@/some/local/path/product.jpg”/productsContent/{productId}

上载
product.jpg
并将其与您的产品实体关联。以及:

curl/productsContent/{productId}
将再次获取它

是的,这确实意味着您需要两个请求来创建产品并将图像与之关联。如果您有充分的理由证明为什么这需要一个请求而不是两个请求,那么就针对SpringContentGithubRepo提出一个问题,我们可以考虑为您添加支持


HTH

您可以发布堆栈跟踪、示例文件属性和完整模型吗?还有,具体的问题是什么?更新了我的模型类,主要是我不能绑定文件和模型类的字段。你不想实际存储文件并与实体关联吗?暂时性有什么好处?尝试过你的方法,并得到了这个错误。internal.org.springframework.content.jpa.boot.autoconfigure.JpaContentAutoConfiguration.databaseInitializer上的错误处理条件。我使用的是mysql。@您使用的是Spring Boot 1还是2?你能提出一个关于github()的完整堆栈跟踪的问题吗?
   <!-- Java API -->
   <dependency>
      <groupId>com.github.paulcwarren</groupId>
      <artifactId>spring-content-jpa-boot-starter</artifactId>
      <version>0.0.11</version>     <!-- Or 0.1.0 for Spring Boot 2 -->
   </dependency>
   <!-- REST API -->
   <dependency>
      <groupId>com.github.paulcwarren</groupId>
      <artifactId>spring-content-rest-boot-starter</artifactId>
      <version>0.0.11</version>     <!-- Or 0.1.0 for Spring Boot 2 -->
   </dependency>
@Entity
public class Product {

   ...existing fields...

   @ContentId
   private String contentId;

   @ContentLength
   private long contentLength = 0L;

   @MimeType
   private String mimeType;

   // no need for MultipartFile
@StoreRestResource(path="productsContent")
public interface ProductContentStore extends ContentStore<Product, String> {
}