2017-08-07 62 views
0

我想用多個屬性訪問器使用SPeL。Spring | SPEL多個屬性訪問器

StandardEvaluationContext simpleContext = new StandardEvaluationContext(myPojo); 
     simpleContext.setVariable("ctx", ruleExecutionContext); 
     simpleContext.setPropertyAccessors(Arrays.asList(new MapAccessor(), new ReflectivePropertyAccessor())); 
     ExpressionParser parser = new SpelExpressionParser(); 
     return (Boolean) parser.parseExpression(spelExpression).getValue(simpleContext, RulebaseConfiguration.LIB_MAP); 

RulebaseConfiguration.LIB_MAP包含{"instanceName": instance}

我想通過對實例可以在一個POJO操作表達式以及調用方法。但它只是將地圖帶入效果。

我得到這個錯誤:

SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'payload' cannot be found on object of type 'java.util.HashMap' - maybe not public?] with root cause 
org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'payload' cannot be found on object of type 'java.util.HashMap' - maybe not public? 
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:226) 
+0

你需要證明你的表情,你正在做什麼。 'getValue(ctx,rootObject)'覆蓋傳入上下文的ctor的'rootObject'。 –

+0

表達式:'payload ['nationality'] =='GBR'' MyPojo(根對象)有一個稱爲有效載荷的映射。 – user1189332

+0

在其他一些情況下,我也會有這樣一個表達式:'payload ['channel'] == nationalityLookup.resolveChannel('CBR1000')' – user1189332

回答

1
  1. 創建上下文和解析每個請求的表達是一種浪費,除非它爲每個請求的不同;在這種情況下,考慮緩存表達式/上下文。

  2. 正如我所說的,因爲你是傳遞一個rootObjectgetValue(),你myPojo是「隱藏」 - 總是在LIB_MAP進行評價。

您需要調用getValue()而沒有根對象才能使用上下文的根對象。您可以添加LIB_MAP作爲變量(例如用名nationalityLookup),並使用

payload['channel'] == #nationalityLookup.resolveChannel('CBR1000')