У меня есть аннотация валидатора
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = ContentAndExtensionValidator.class)
public @interface WithContentAndExtension {
ContentAndExtension[] contentAndExtensions() default{};
String message() default "File is not valid";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
По существу, валидатор будет принимать пары типа содержимого и расширения файла и проверять, допустим ли файл Multipart среди одной из этих пар.
Я мог бы использовать это так
methodName( @WithContentAndExtension(
contentAndExtensions = {
@ContentAndExtension(contentType = "text/xml", fileExtension = ".xml"),
@ContentAndExtension(contentType = "application/octet-stream", fileExtension = ".bundle")
},
message = "File is not a valid XML or doesn't have .bundle extension" ) MultipartFile file){
//Method definition here
}
Но, очевидно, это слишком многословно ... Было бы лучше, если бы я мог абстрагироваться с помощью другой аннотации.
@Target( ElementType.PARAMETER )
@WithContentAndExtension(
contentAndExtensions = {
@ContentAndExtension(contentType = "text/xml", fileExtension = ".xml"),
@ContentAndExtension(contentType = "application/octet-stream", fileExtension = ".bundle")
},
message = "File is not a valid XML or doesn't have .bundle extension"
)
@Retention(RetentionPolicy.SOURCE)
@Documented
public @interface ValidBundleFile {
}
И используйте это вот так
methodName(@ValidBundleFile MultipartFile file){
//Method implementation here
}
У меня может быть нехватка понимания о том, как правильно абстрагировать детали, и я тоже гуглял и не могу их найти.Я ценю ваш совет.