在 th select 的 SpringEL 表达式中将 String 转换为 Long

Cast String to Long in SpringEL expression for th select

我正在使用列表中的对象 ID 来决定是否应该选择它,如下所示:

<option th:each="tag : ${tagList}" th:value="${tag.id}" th:text="${tag.text}" th:selected="${idSet.contains(tag.id)}"></option>

但是,我必须专门创建 idSet (Set<Long>),作为我最初的实现,使用现有的 Set<String>:

<option th:each="tag : ${tagList}" th:value="${tag.id}" th:text="${tag.text}" th:selected="${searchSet.contains(Long.valueOf(tag.id))}"></option>

<option th:each="tag : ${tagList}" th:value="${tag.id}" th:text="${tag.text}" th:selected="${searchSet.contains(Long.parseLong(tag.id))}"></option>

产生了这个异常:

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1011E: Method call: Attempted to call method valueOf(java.lang.Long) on null context object

如何在 SpringEL 表达式中使用我现有的一组带有 long 的字符串?

特殊的'T'运算符可用于指定java.lang.Class('type')的实例。 也使用此运算符调用静态方法

parseLong(String)Long

的静态方法

所以这应该有效

T(Long).parseLong(...)

向视图提供 SetLong 值可能更简洁。您可以进行单元测试、缓存并使视图更简单。

Set<Long> longSet = setOfStrings.stream() 
                                .map(s -> Long.parseLong(s)) 
                                .collect(Collectors.toSet()); 

model.addAttribute("searchSet", longSet);

否则,您可以使用 Spring 的 T 运算符静态解析字符串(或为 Java 创建一个 bean 实用程序,但这可能有点矫枉过正)。