새소식

스프링

No JSR 223 script engine found for language "javascript".

  • -
@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);
        }
    }
    
    // ...
}

 

라고 하셨다...

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.