@Data
@ScriptAssert(lang = "javascript", script = "_this.price * _this.quantity >= 10000", message = "총합이 10,000원이 넘게 입력해주세요.")
public class Item {
private Long id;
private String itemName;
private Integer price;
private Integer quantity;
}
인프런에서 영한님의 spring mvc 2 강의를 보던 중 @ScriptAssert 사용 시 다음과 같은 오류가 발생했다.
No JSR 223 script engine found for language "javascript".
원인은 바로 JDK 버전 때문이다.
JDK 8~14까지는 Javascript를 지원하는 Nashorn 엔진을 사용하지만 그 이후에는 더 이상 지원을 하지 않게 되었다.
JEP 372: Remove the Nashorn JavaScript Engine
JEP 372: Remove the Nashorn JavaScript Engine OwnerJim LaskeyTypeFeatureScopeJDKStatusClosed / DeliveredRelease15Componentcore-libs / jdk.nashornDiscussionjdk dash dev at openjdk dot java dot netEffortMDurationMRelates toJEP 335: Deprecate the Nash
openjdk.org
그래서 이제 다음와 같이 Nashorn 의존성을 추가해주면 오류 없이 사용이 가능하다.
implementation 'org.openjdk.nashorn:nashorn-core:15.3'
그런데 이제 영한님이 다음에 결정적인 내용을 말씀하신다.
실제로 이제 @ScriptAssert를 쓰기에는 기능이 너무 약하고 객체의 범위를 벗어나는 경우도 많기 때문에 위와 같이 특정 필드가 아닌 복합 룰을 검증해야 하는 경우에는 직접 자바 코드로 써주는 것이 낫다.
@PostMapping("/add")
public String addItem(@Validated @ModelAttribute("item") ItemSaveForm form, BindingResult bindingResult, RedirectAttributes redirectAttributes) {
// 특정 필드가 아닌 복합 룰 검증
if (form.getPrice() != null && form.getQuantity() != null) {
int resultPrice = form.getPrice() * form.getQuantity();
if (resultPrice < 10000) {
bindingResult.reject("totalPriceMin", new Object[]{10000, resultPrice}, null);
}
}
// ...
}
라고 하셨다...