SpEL czyli Spring Expression Language

SpEL czyli Spring Expression Language

Spring Expression Language jest językiem wyrażeń który upraszcza dostęp do obiektów czy parsowanie danych np. w ramach zapytań. Rozważmy przykład użycia SpEL na przykładzie adnotacji Query. Dla uproszczenia artykułu nie będę tutaj przedstawiał konfiguracji bazy danych. Utwórzmy prostą encję:

@Entity(name = "employee")
public class Employee {
 
  @Id
  @GeneratedValue
  private Long id;
 
  private String name;
  private String surname;
  private int salary;
 
  public Employee() {
  }
 
  public Employee(String name, String surname, int salary) {
    this.name = name;
    this.surname = surname;
    this.salary = salary;
  }
 
  @Override
  public String toString() {
    return "Employee{" +
            "name='" + name + '\'' +
            ", surname='" + surname + '\'' +
            ", salary=" + salary +
            '}';
  }
}

Przykładowe repozytorium z wyrażeniem SpEL:

@Repository
public interface EmployeeRepository extends CrudRepository<Employee, Long> {
 
  @Query("SELECT e FROM #{#entityName} e WHERE e.name = ?1")
  List<Employee> findByName(String name);
}

Klasa startowa:

@SpringBootApplication
public class SpElApplication implements CommandLineRunner {
 
	@Autowired
	EmployeeRepository employeeRepository;
 
	@Override
	public void run(String... args) throws Exception {
 
		employeeRepository.save(new Employee("Tom", "Spring", 2000));
                employeeRepository.save(new Employee("Davids", "Spring", 3000));
 
		Iterable<Employee> all = employeeRepository.findAll();
		all.forEach(System.out::println);
 
	}
 
	public static void main(String[] args) {
		SpringApplication.run(SpElApplication.class, args);
	}
 
}

używając wyrażenia SpEL:

#{#entityName}

nie definiujemy na sztywno nazwy encji z której pobierane są dane. Jest ona rozwiązywana dynamicznie na podstawie:

@Entity(name = "employee")

w wyniku wykonania metody findAll otrzymamy:

Employee{name='Tom', surname='Spring', salary=2000}
Employee{name='Davids', surname='Spring', salary=3000}

załóżmy że chcielibyśmy zdefiniować następujące filtry wyszukiwania:

  • name,
  • surname,
  • salary.

wykorzystajmy wyrażenia SpEL i dodajmy nową metodę wyszukiwania do naszego repozytorium:

@Query("SELECT e FROM #{#entityName} e WHERE " +
        "(:#{#name} is NULL OR e.name =:#{#name}) " +
        "AND " +
        "(:#{#surname} is NULL OR e.surname =:#{#surname})" +
        "AND" +
        "(:#{#salary} is NULL OR e.salary >:#{#salary})")
List<Employee> findEmployeeByCriteria(
        String name,
        String surname,
        int salary
);

Test – wyszukajmy pracowników których pensja jest wyższa niż 2000:

Iterable<Employee> allCriteriaEmployee = employeeRepository.findEmployeeByCriteria(null, null, 2000);
allCriteriaEmployee.forEach(System.out::println);

w wyniku wykonania metody findEmployeeByCriteria z parametrem pensji 2000 otrzymamy pracowników których pensja jest wyższa niż 2000. W naszym przypadku jest to tylko jeden taki pracownik:

Employee{name='Davids', surname='Spring', salary=3000}

Skorzystajmy teraz z wyrażeń SpEL w kontekście adnotacji Value:

@Component
public class EnviromentInfo {
 
    @Value("#{systemProperties['java.home']}")
    public String JAVA_HOME;
}

z pomocą wyrażeń SpEL udało się z powodzeniem odczytać wartość parametru zmiennje środowiskowej JAVA_HOME:

System.out.println(enviromentInfo.JAVA_HOME);

Zobacz kod na GitHubie i zapisz się na bezpłatny newsletter!

.

Leave a comment

Your email address will not be published.


*