Java SpEL EL1043E:意外的令牌.预期'rparen())'但是'逗号(,)'

Mat*_*zak 1 java spring spring-el java-8

我尝试学习SpEL,但我的一个脚本不起作用.我的脚本是:

changePages(#{T(StoryContent).pages}, (x, y) -> x.replaceAll(y, x.substring(0, 1) + '...' + x.substring(x.length() - 1, x.length())))
Run Code Online (Sandbox Code Playgroud)

Java代码:

     public void validate(Story story, List<StoryRule> rules) throws NoSuchMethodException, SecurityException {
            StoryContent storyContent = storyContentRepository.findOne(story.getContentId());
            story.setStatus(SchedulerStatus.VALIDATION);
            storyRepository.save(story);
            ExpressionParser parser = new SpelExpressionParser();
            StandardEvaluationContext inventorContext = new StandardEvaluationContext(storyContent);
            inventorContext.registerFunction("changePages", ValidationByRuleServiceImpl.class
                    .getDeclaredMethod("changePages", new Class[] { List.class, BiFunction.class }));
            try {
                rules.stream().map(StoryRule::getScript)
                        .forEach(script -> parser.parseExpression(script).getValue(inventorContext));
                if (!storyContent.getTitle().equals(story.getName()))
                    story.setName(storyContent.getTitle());
                story.setStatus(SchedulerStatus.PUBLISHED);
                storyContentRepository.save(storyContent);
            } catch (Exception e) {
                LOG.error(e.getMessage());
                story.setStatus(SchedulerStatus.ERROR);
            } finally {
                storyRepository.save(story);
            }
    }
    private void changePages(List<String> pages, BiFunction<String, String, String> function) {
        pages.forEach(System.out::println);
    }
Run Code Online (Sandbox Code Playgroud)

错误是:

Expression [changePages(T(StoryContent).pages, (x, y) -> x.replaceAll(y, x.substring(0, 1) + '...' + x.substring(x.length() - 1, x.length())))] @37: EL1043E: Unexpected token. Expected 'rparen())' but was 'comma(,)'
Run Code Online (Sandbox Code Playgroud)

我从DB获得SpEL脚本列表.

我不知道有什么问题,我的脚本还是我的java代码?

Gar*_*ell 5

SpEL不是Java,它是一种不同的语言; 首字母缩写词代表Spring Expression Language.

它不懂Java8 lambdas所以无法解析(x, y) -> ....

但是,您可以将lambdas注册为SpEL函数,请参阅我的答案.