【问题标题】:Validate an UserDto class in spring boot with Angular使用 Angular 在 Spring Boot 中验证 UserDto 类
【发布时间】:2021-11-15 07:00:20
【问题描述】:

我正在尝试使用 @Valid 从这样的角度应用程序发送表单数据来验证 userDto 类:

角度形式:

this.form.append('email', this.user.email);
this.form.append('password', this.user.password);
this.form.append('firstName', this.user.firstName);
this.form.append('lastName', this.user.lastName);
this.form.append('photo', this.file.name);
this.form.append('enable', `${this.user.enable}`);
this.form.append('roles', JSON.stringify(this.user.roles));
this.form.append('file', this.file);

this.userService.createUser(this.form)

控制器类:

@PostMapping
    public ResponseEntity<Object> save(@Valid UserDto userDto, @RequestPart("file") MultipartFile file) throws IOException {
        service.save(userDto.convertToUser(userDto, file.getOriginalFilename()), file);
        return new ResponseEntity<>(HttpStatus.CREATED);
    }

UserDTO 类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDto {
    
    private Integer id;

    @NotEmpty(message = "email is required")
    private String email;
    
    @NotEmpty(message = "password is required")
    private String password;
    
    @NotEmpty(message = "first name is required")
    private String firstName;

    @NotEmpty(message = "last name is required")
    private String lastName;

    private String photo;
    private String enable;
    private String roles;

    public User convertToUser(UserDto userDto, String photoName) {

        User user = new User();

        ObjectMapper mapper = new ObjectMapper();
 
        try {
            List<Role> rolesDto = 
                     Arrays.asList(mapper.readValue(userDto.getRoles(),Role[].class));

            Set<Role> roles = Set.copyOf(rolesDto);

            user.setId(this.id);
            user.setEmail(this.email);
            user.setPassword(this.password);
            user.setFirstName(this.firstName);
            user.setLastName(this.lastName);
            user.setPhoto(photoName);
            user.setEnable(Boolean.parseBoolean(this.enable));
            user.setRoles(roles);
                           
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        return user;
    }
}

但是如果我传递一个空的表单数据,那么引发异常的类就是我的 User 类,我希望 UserD 抛出异常而不是 User 类。

我尝试将 @RequestBody 注释与 @Valid 一起使用,但我使用的是 angular 而不是 json 格式的表单数据。

有没有办法在 Spring Boot 中验证表单数据,将表单传递给没有 @Entity 注释的 DTO 类?

【问题讨论】:

    标签: java angular spring-boot


    【解决方案1】:

    您可以使用org.hibernate.validator 中的Validator 接口来验证DTO。有关Hibernate Validator 的更多信息。或者你可以浏览Spring boot : non-entity bean validation not workingWhy does validation not work on objects of type DTO, but only on entities

    public class Car {
    
        @NotNull
        private String manufacturer;
    
        @NotNull
        @Size(min = 2, max = 14)
        private String licensePlate;
    
        @Min(2)
        private int seatCount;
    
        public Car(String manufacturer, String licencePlate, int seatCount) {
            this.manufacturer = manufacturer;
            this.licensePlate = licencePlate;
            this.seatCount = seatCount;
        }
    
        //getters and setters ...
    }
    
    package org.hibernate.validator.referenceguide.chapter01;
    
    import java.util.Set;
    import jakarta.validation.ConstraintViolation;
    import jakarta.validation.Validation;
    import jakarta.validation.Validator;
    import jakarta.validation.ValidatorFactory;
    
    import org.junit.BeforeClass;
    import org.junit.Test;
    
    import static org.junit.Assert.assertEquals;
    
    public class CarTest {
    
        private static Validator validator;
    
        @BeforeClass
        public static void setUpValidator() {
            ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
            validator = factory.getValidator();
        }
    
        @Test
        public void manufacturerIsNull() {
            Car car = new Car( null, "DD-AB-123", 4 );
    
            Set<ConstraintViolation<Car>> constraintViolations =
                    validator.validate( car );
    
            assertEquals( 1, constraintViolations.size() );
            assertEquals( "must not be null", constraintViolations.iterator().next().getMessage() );
        }
    
        @Test
        public void licensePlateTooShort() {
            Car car = new Car( "Morris", "D", 4 );
    
            Set<ConstraintViolation<Car>> constraintViolations =
                    validator.validate( car );
    
            assertEquals( 1, constraintViolations.size() );
            assertEquals(
                    "size must be between 2 and 14",
                    constraintViolations.iterator().next().getMessage()
            );
        }
    
        @Test
        public void seatCountTooLow() {
            Car car = new Car( "Morris", "DD-AB-123", 1 );
    
            Set<ConstraintViolation<Car>> constraintViolations =
                    validator.validate( car );
    
            assertEquals( 1, constraintViolations.size() );
            assertEquals(
                    "must be greater than or equal to 2",
                    constraintViolations.iterator().next().getMessage()
            );
        }
    
        @Test
        public void carIsValid() {
            Car car = new Car( "Morris", "DD-AB-123", 2 );
    
            Set<ConstraintViolation<Car>> constraintViolations =
                    validator.validate( car );
    
            assertEquals( 0, constraintViolations.size() );
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 2019-10-16
      • 2020-12-21
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      相关资源
      最近更新 更多