List<String> blogUrls
로 구성되어있다. 이러한 List<String> 타입은 Java Bean Validation에서 검증가능한 어노테이션이 존재하지 않는다.List<String>** **BlogUrls**
에대한 커스텀 어노테이션을 생성한다.@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = UrlListValidator.class)
public @interface ValidUrl {
String message() default "Invalid URL format. Ensure it starts with 'http://' or 'https://'.";;
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Slf4j
public class UrlListValidator implements ConstraintValidator<ValidUrl, List<String>> {
//TODO: 잘못된 메서드
@Override
public boolean isValid(List<String> urlList, ConstraintValidatorContext context) {
if (urlList == null || urlList.isEmpty()) {
return true;
}
for (String url : urlList) {
if (url == null || url.isBlank()) {
return false;
}
// 둘다 포함하지 않는다면 (true)
if (!url.startsWith("http://") && !url.startsWith("https://")) {
return false;
}
}
// 모든 검증 통과시 true
return true;
}
}
BlogMetaExtractor.class
를 통해서 URL을 통해 블로그 메타 데이터 정보를 출력할 수 있는데 이때 URL들은 http://
또는 https://
로 시작하여야 한며 블로그 URL들은 반드시 필수 필드는 아니다.http://
, https://
를 포함하지 않는다면 검증로직 통과 실패를 하도록설정,
그밖에는 모두 통과하도록 설정하였다.PlaceFormRequestDto.java
@Getter
@Setter
@NoArgsConstructor
@ToString
public class PlaceFormRequestDto {
@NotNull(message = "Not Blank Category")
@Min(value = 1, message = "CategoryId must be greater than 0")
private Integer categoryId;
@NotBlank(message = "Not Blank Name")
private String name;
private String phone;
@NotBlank(message = "Not Blank Address")
private String addressPart1;
@NotBlank(message = "Not Blank Address")
private String addressPart2;
@NotNull(message = "Not Blank Price")
private Integer price;
private String reservationUrl;
private String description;
// Custom Annotation 생성
@ValidUrl
@Size(max = 4, message = "BlogUrls can have at most {max} items")
private List<String> blogUrls;
private List<PlaceNewImageDto> images;
......