我需要使用 SpEL 訪問 Spring Repository 中的當前語言環境。
我有下一個Repository:
@Repository
public interface RoomRepository extends JpaRepository<Room, Long> {
@Query(..."left join rc.roomClassTranslations rct on rct.language = ?#{SpEL expression})
List<RoomDTO> findAllRooms(Sort sort);
}
我嘗試了幾種表達方式,但都沒有奏效。
#{@localeResolver.resolveLocale(#httpServletRequest).toLanguageTag()} "...)在這個運算式中 httpServletRequest 為 null,如果我將其更改為@httpServletRequest,它將給出一個錯誤,即找不到 bean。我也嘗試像這樣重寫它
#{LocaleContextHolder.getLocale().toLanguageTag()}這將給出下一個錯誤:
EL1011E: 方法呼叫:嘗試在空背景關系物件上呼叫方法 getLocale()。
那么如何在 SpEL 運算式中訪問當前語言環境呢?
uj5u.com熱心網友回復:
Spring支持在使用.@Query
Spring Data 公開了一個擴展點EvaluationContextExtension。
Spring Data JPA 將獲取所有型別的 bean并EvaluationContextExtension使用它們來準備EvaluationContext用于評估.@Query
讓我們以語言環境擴展為例。
@Component
public class LocaleEvaluationContextExtension
implements EvaluationContextExtension {
@Override
public Map<String, Object> getProperties() {
Map<String, Object> properties = new HashMap<>(
EvaluationContextExtension.super.getProperties());
return properties;
}
@Override
public String getExtensionId() {
return "locale";
}
@Override
public Object getRootObject() {
return LocaleContextHolder.getLocale();
}
}
查詢方法定義應該是:
@Query(..."left join rc.roomClassTranslations rct on "
"rct.language = ?#{locale.language})
List<RoomDTO> findAllRooms(Sort sort);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/452759.html
