验证不在服务层执行
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
而不是代理另外执行验证。
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
而不是代理另外执行验证。