Запись Maven для SpEL в качестве скрипта

#spring #spring-el #jsr223

#spring #spring-el #jsr223

Вопрос:

Не могли бы вы указать мне на зависимость от maven, чтобы добавить язык выражений SpEL — Spring — в качестве скрипта в мой проект — есть ли он в Spring?)

Я нашел несколько примеров:

https://gist.github.com/maggandalf/1380124

https://github.com/melin/starflow/blob/master/src/main/java/com/googlecode/starflow/core/script/spel/SpelScriptEngine.java

Код в примерах показывает, как обернуть SpEL в виде скриптового движка JSR-223 и сделать его доступным для менеджера сценариев по имени (скажем, «spel»).

Но я бы хотел, чтобы это было в форме зависимости от maven.

Ответ №1:

Я не знаю, правильно ли я вас понимаю, но попробуйте это

 <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>4.3.3.RELEASE</version>
</dependency>
 

Если pom.xml имеет только эту зависимость, код в пакете
https://github.com/melin/starflow/blob/master/src/main/java/com/googlecode/starflow/core/script/spel/

должна компилироваться с помощью JDK1.8.

(замените 4.3.3.RELEASE другой версией, если есть необходимость).

Комментарии:

1. Спасибо, извините, у меня есть это. Но это не делает его доступным в качестве скриптового движка JSR-223. С этим в classpath у меня по-прежнему доступны только JS, Beanshell и JUEL. Код в примерах показывает, как обернуть SpEL в качестве скриптового движка и сделать его доступным для менеджера сценариев по имени (скажем, «spel»)

2. Похоже, существует связанная проблема, которая все еще открыта, на jira.spring.io/browse/SPR-7651 . Если код на github соответствует вашим требованиям, и лицензия в порядке, должна быть возможность упаковать нужную вам часть кода в вашу собственную пользовательскую библиотеку и загрузить ее в центральный репозиторий Maven.

Ответ №2:

Я только что попробовал https://github.com/eobermuhlner/spel-scriptengine

Вам просто нужно добавить это в свой pom.xml

     <dependency>
      <groupId>ch.obermuhlner</groupId>
      <artifactId>spel-scriptengine</artifactId>
      <version>1.0.0</version>
    </dependency>
 

А затем используйте его с помощью Hibernate Validator следующим образом:

 package org.eu.rubensa.model;

import java.time.Instant;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.ScriptAssert;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "sample")
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@AllArgsConstructor
@ScriptAssert.List({
    // Month valiadation
    @ScriptAssert(lang = "spel", alias = "_this", script = "#_this.getLower() == null || #_this.getHigher() == null || #_this.getHigher().compareTo(#_this.getLower()) >= 0", reportOn = "finalMonth", message = "{org.eu.rubensa.validation.LowerGreaterThanHigher.message}"),
    // Instant validation
    @ScriptAssert(lang = "spel", alias = "_this", script = "#_this.getStart() == null || #_this.getEnd() == null || #_this.getEnd().compareTo(#_this.getStart()) >= 0", reportOn = "fechaFinPresentacion", message = "{org.eu.rubensa.validation.StartGreaterThanEnd.message}") })
public class SampleEntity {
  @Id
  @Column(name = "id", nullable = false)
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sample_seq")
  @SequenceGenerator(name = "sample_seq", sequenceName = "sample_seq", allocationSize = 1)
  private Long id;

  @Column(name = "lower", nullable = false)
  @NotNull
  @Min(1)
  private Integer lower;

  @Column(name = "higher", nullable = false)
  @NotNull
  @Min(1)
  private Integer higher;

  @Column(name = "start", nullable = true)
  private Instant start;

  @Column(name = "end", nullable = true)
  private Instant end;
}