【问题标题】:SPeL - set a value of an object which should be in an empty listSPeL - 设置一个应该在一个空列表中的对象的值
【发布时间】:2020-09-16 10:01:26
【问题描述】:

我有以下 SPel 表达式:

custData.address[0].postcode

custData 是现有对象,但 address 是一个空列表。它是一个现有的对象,但它是空的。当我尝试在此路径上设置邮政编码时,我得到了

org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'postcode' cannot be found on null

我需要将一个新的address 对象放入列表并设置其postcode 属性。
是不是可以在 SPel 表达式中完成?

谢谢,
五、

【问题讨论】:

    标签: spring spring-el


    【解决方案1】:

    所以这基本上是一个 NullPointerException。您需要确保您尝试从中获取字段值的对象存在。 SPeL 具有特殊运算符“?”检查对象是否有价值,虽然我不确定它是否适用于数组,但绝对值得一试。通常,某些对象可能为 null 的表达式如下所示:

    object?.anotherObject?.field
    

    这确保“object”不为空,如果它有值,则获取“anotherObject”并检查它是否也不为空,然后获取“field”。所以尝试这样的事情:

    custData.address[0]?.postcode
    

    【讨论】:

    • 感谢您的回复!恐怕这行不通,在这种情况下我得到了java.lang.IllegalStateException: No result type
    • 也许你可以实现一个简单的服务来检查这个对象是否存在,像这样的一些方法:public boolean checkIfNull( Object object ) { return object == null; } 然后在你的视图中的“if-else”子句中调用它。我使用 Thymeleaf 作为模板处理器,它看起来像这样:<th:block th:unless="${@serviceName.checkIfNull( custData.address[0] )}">[[${custData.address[0].postcode}]]</th:block><th:block th:if="${@serviceName.checkIfNull( custData.address[0] )}">No address object!</th:block>
    • 谢谢帕维尔!最后我还是用了同样的思路。
    【解决方案2】:

    最终我在 spel 表达式中使用了自定义函数。

    #addIfNecessary(custData.address, 0, "uk.co.acme.AddressType").postcode
    

    用户定义函数是

    import org.springframework.util.ReflectionUtils;
    import java.util.List;
    
    public class CustomFunc {
    
        public static Object addIfNecessary(List<Object> list, Integer index, String className) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
            Object o = null;
            if (list != null) {
                if (list.size() <= index || list.get(index) == null) {
                    list.set(index, Class.forName(className).newInstance());
                }
                o = list.get(index);
            }
            return o;
        }
    }
    

    它既不好也不优雅,但它确实有效。
    如果你有更优雅的,请告诉我!

    【讨论】:

      猜你喜欢
      • 2015-02-16
      • 2017-09-18
      • 2021-10-17
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 2020-08-06
      相关资源
      最近更新 更多