Spring Boot:如何在SpringBoot中验证多部分表单 [英] Spring boot: how can I validate a multipart form in springboot

查看:296
本文介绍了Spring Boot:如何在SpringBoot中验证多部分表单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在尝试验证表单(获取请求)时,我知道ResultBinding,在尝试验证请求正文时,我也知道了@Valid,但我不知道如何验证multipartForm Request参数.我有一个包含我的User.class的json字符串表示形式的请求参数@RequestParam("model") String userJson的多部分表单.当我将json转换为对象时,

I am aware of ResultBinding when trying to validate a form (get request), i am also aware of @Valid when trying to validate a request body but i have no knowledge of validating a multipartForm Request parameter. I have a multipart form with a request parameter @RequestParam("model") String userJson of a json string representation of my User.class. when i convert the json to an object,

User user = new Gson().fromJson(userJson, User.class);

我如何检查用户类中的参数是否满足要求,例如(具有'@'或没有数字值的名字的电子邮件)?

how can i check if the parameters in the user class meets requirements, such as (email having an '@' or first name not having numeral values) ?

这是我的代码,控制器:

This is my code, the controller :

    @RequestMapping(value = "/signup", method = RequestMethod.POST)
    public ResponseEntity<ResponseModel> SignUp(@RequestParam("file") MultipartFile file, @RequestParam("model") String userJson, RedirectAttributes redirectAttributes){

        User tempSavedUser = new User();

        try {

                if (file.isEmpty()) {
                    redirectAttributes.addFlashAttribute("message", "Please select a file to upload");

                

        responseModel.setIsSuccessful(false).setResponseMessage("Please select an image to upload");
    
                        return new ResponseEntity<>(responseModel, HttpStatus.CREATED); // return response to client.
                    }
    
                    User user = new Gson().fromJson(userJson, User.class);
    tempSavedUser = this.defaultUserDAOService.saveUser(user);
responseModel.setIsSuccessful(true);

                        responseModel.setResponseMessage("Registration was successful, Please check your mail for an account activation link");

                        return new ResponseEntity<ResponseModel>(responseModel, HttpStatus.CREATED);
    }

这是要进行以下操作的用户类:

this is the user class to:

@Table(name = "Users")
public class User extends DefaultEntity {


    @Column(name = "FirstName")
    @NotNull(message = "Enter a FirstName")
    private String firstName;


    @Column(name = "LastName")
    @NotBlank(message = "Enter a LastName")
    private String lastName;


    @Column(unique = true,name = "UserName")
    @NotBlank(message = "Enter a UserName")
    private String userName;


    @Column(unique = true, name = "Email")
    @NotBlank(message = "Please enter an Email address")
    @Email(message = "Enter a valid Email")
    private String email;


    @Column(name = "Password")
    @NotBlank(message = "Enter a Password")
    private String password;


    @Enumerated(EnumType.STRING)
    @Column(name = "Gender")
    private Gender gender;


    @Column(name = "Address")
    @NotBlank(message = "Please enter your Home Address")
    private String address;


    @Column(name = "Country")
    @NotBlank(message = "Please enter your Country")
    private String country;


    @Column(name = "Picture")
    private String picture;


    @Column(unique = true, name = "PhoneNumber") //make this accept only numbers
    private String phoneNumber;


    @Column(name = "Bio")
    private String bio;


    @Enumerated(EnumType.STRING)
    @Column(name = "OnlineStatus")
    private OnlineStatus onlineStatus;

    @Enumerated(EnumType.STRING)
    @Column(name = "UserType")
    private UserType userType;


    @Column(name = "Money")
    private double money;


    //@MapsId()
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "playerstats")
    private PlayerStats playerStats;

    //columnDefinition = "tinyint default false"
    @Column(name = "locked",columnDefinition = "BOOL default false")
    private Boolean locked;


    @Transient
    private MultipartFile file;


    public String getFirstName() {
        return firstName;
    }

    public User setFirstName(String firstName) {
        this.firstName = firstName;
        return this;
    }

    public String getLastName() {
        return lastName;
    }

    public User setLastName(String lastName) {
        this.lastName = lastName;
        return this;
    }

    public String getUserName() {
        return userName;
    }

    public User setUserName(String userName) {
        this.userName = userName;
        return this;
    }

    public String getEmail() {
        return email;
    }

    public User setEmail(String email) {
        this.email = email;
        return this;
    }

    public String getPassword() {
        return password;
    }

    public User setPassword(String password) {
        this.password = password;
        return this;
    }

    public Enum.Gender getGender() {
        return gender;
    }

    public User setGender(Enum.Gender gender) {
        this.gender = gender;
        return this;
    }

    public String getAddress() {
       return address;
    }

    public User setAddress(String address) {
       this.address = address;
       return this;
    }

    public String getCountry() {
        return country;
    }

    public User setCountry(String country) {
        this.country = country;
        return this;
    }

    public String getPicture() {
        return picture;
    }

    public User setPicture(String picture) {
        this.picture = picture;
        return this;
    }

    public String getBio() {
        return bio;
    }

    public User setBio(String bio) {
        this.bio = bio;
        return this;
    }

    public Enum.OnlineStatus getOnlineStatus() {
        return onlineStatus;
    }

    public User setOnlineStatus(Enum.OnlineStatus onlineStatus) {
        this.onlineStatus = onlineStatus;
        return this;
    }

    public Enum.UserType getUserType() {
        return userType;
    }

    public User setUserType(Enum.UserType userType) {
        this.userType = userType;
        return this;
    }

    public double getMoney() {
        return money;
    }

    public User setMoney(double money) {
        this.money = money;
        return this;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public User setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
        return this;
    }

    public MultipartFile getFile() {
        return file;
    }

    public User setFile(MultipartFile file) {
        this.file = file;
        return this;
    }

    public PlayerStats getPlayerStats() {
        return playerStats;
    }

    public User setPlayerStats(PlayerStats playerStats) {
        this.playerStats = playerStats;
        return this;
    }

    public Boolean getLocked() {
        return locked;
    }

    public void setLocked(Boolean locked) {
        this.locked = locked;
    }

}

推荐答案

为了用spring验证多部分表单,您可以采用这种方法:

Inorder to validate a multipart form with spring you can take take this approach :

  • 包括用于上传MultipartFile的commons-fileupload.
  • 包括validation-api以创建验证器.

作为:

<dependency>
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
   <version>1.3.1</version>
  </dependency>
  <dependency>
   <groupId>javax.validation</groupId>
   <artifactId>validation-api</artifactId>
   <version>1.1.0.Final</version>
</dependency>

2.创建Web配置:

@EnableWebMvc
@Configuration
@ComponentScan(basePackages = {
    "com.test"
})
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/jsp/");
        viewResolver.setSuffix(".jsp");

        return viewResolver;
    }

    @Bean
    public ResourceBundleMessageSource messageSource() {
        ResourceBundleMessageSource rb = new ResourceBundleMessageSource();
        rb.setBasenames(new String[] {
            "validation"
        });

        return rb;
    }

    @Bean(name = "multipartResolver")
    public CommonsMultipartResolver getResolver() {
        CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
        //set max upload size per file is 20mb
        commonsMultipartResolver.setMaxUploadSizePerFile(20 * 1024 * 1024);

        return commonsMultipartResolver;
    }
}

3.创建从AbstractAnnotationConfigDispatcherServletInitializer

扩展的WebInitializer类

3.Create WebInitializer Class which extends from AbstractAnnotationConfigDispatcherServletInitializer

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class << ? > [] getRootConfigClasses() {
        return new Class[] {
            WebConfig.class
        };
    }

    @Override
    protected Class << ? > [] getServletConfigClasses() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] {
            "/"
        };
    }
}

4.创建模型

public class Model {
    private User user;
    private CommonsMultipartFile[] files;
    //getter and setter
}

5.创建一个验证器以验证您的文件

@Component
public class ModelValidator implements Validator {

    public boolean supports(Class << ? > clazz) {
        return Model.class.isAssignableFrom(clazz);
    }

    public void validate(Object target, Errors errors) {
        Model model = (Model) target;

        CommonsMultipartFile[] commonsMultipartFiles = model.getFiles();

        for (CommonsMultipartFile multipartFile: commonsMultipartFiles) {
            if (multipartFile.getSize() == 0) {
                errors.rejectValue("files", "myapplication.missing.file");
            }
        }
    }
}

6.在资源文件夹下的侧面application.properties中添加验证错误消息

myapplication.missing.file=No file choose

7.开发控制器

@Controller
@RequestMapping(value = "/")
public class Controller {

    @Autowired
    ModelValidator modelValidator;

    @RequestMapping(value = "/page", method = RequestMethod.GET)
    public ModelAndView page() {
        ModelAndView model = new ModelAndView("page");
        model.addObject("model", new Model());

        return model;
    }

    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public ModelAndView upload(@ModelAttribute("model") Model model, BindingResult result) throws IOException {
        // :::: VALIDATION HAPPENS HERE ::::
        fileValidator.validate(model, result);

        if (result.hasErrors()) {
            return new ModelAndView("page");
        }

        return new ModelAndView("success", "fileNames", processUpload(model));
    }

    private List < String > processUpload(Model model) throws IOException {
        List < String > Models = new ArrayList < String > ();

        CommonsMultipartFile[] commonsMultipartFiles = model.getFiles();

        for (CommonsMultipartFile multipartFile: commonsMultipartFiles) {
            FileCopyUtils.copy(multipartFile.getBytes(), new File("C:\\upload\\" + multipartFile.getOriginalFilename()));
            fileNames.add(multipartFile.getOriginalFilename());
        }

        return fileNames;
    }
}

更多信息:

https://memorynotfound.com/spring-mvc-file- upload-example-validator/ http://websystique.com/springmvc/spring-mvc -4-fileupload-download-hibernate-example/ http://javainsimpleway.com/spring-mvc-file-upload-with -validation/

这篇关于Spring Boot:如何在SpringBoot中验证多部分表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆