验证不在服务层执行

Validation does not execute in service layer

hibernate-validator 在我的 spring 引导项目的服务层中不起作用。

我的域模型:

@Data
public class IssueAttachmentDto extends AttachmentDto {

    @NotEmpty
    private String issueId;

}

@Data
public class AttachmentDto {

    /**
     * Only allow digit 1~5
     */
    @NotEmpty
    @Pattern(regexp = "\b[1-5]\b")
    private String attachmentType;

    @NotEmpty
    @Valid
    private FileDto fileDto;
}

@Data
public class FileDto extends BaseDto {

    @NotEmpty
    private String fileType;

    /**
     * Only allow positive integer
     */
    @NotEmpty
    @Pattern(regexp = "^[0-9]*[1-9][0-9]*$")
    private Long fileSize;

    @NotEmpty
    private String fileKey;

    @NotEmpty
    private String fileName;
}

我的服务class:


@Slf4j
@Service
@Validated
public class AttachmentServiceImpl implements AttachmentService { 
  @Override
  public void uploadAttachment(IssueAttachmentDto issueAttachmentDto) {
    try {
      checkUploadAttachmentArgument(issueAttachmentDto);
    } catch (Exception e) {
      e.printStackTrace();
      throw e;
    }
        // something else...
  }

  private void checkUploadAttachmentArgument(@Valid IssueAttachmentDto issueAttachmentDto) {
    // something else
  }
}

我的配置class:

@Configuration
public class ConversionConfig {

    @Bean
    public ConversionService conversionService() {
        return new DefaultConversionService();
    }
}

方法checkUploadAttachmentArgument(@Valid IssueAttachmentDto issueAttachmentDto)无论我通过什么都不会抛出异常。在我看来,当我传递非法数据时,它会抛出 ConstraintViolationException。我的代码或我的配置有什么问题,请帮助我。

Spring 无法代理私有方法 - 这就是为什么当将无效对象作为参数传递时您看不到任何异常被抛出的原因。

只需将 @Valid 注释移动到 uploadAttachment 方法参数,它就会按预期工作。它应该是这样的:

public void uploadAttachment(@Valid IssueAttachmentDto issueAttachmentDto) {
    // actual upload attachent logic
}

编辑:

即使 Spring 可以代理私有方法,它也不会在您的情况下验证带注释的参数,因为您实际上是在原始 class 的实例上调用 checkUploadAttachmentArgument 而不是代理另外执行验证。