有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在Spring EL中访问列表的属性?

EL试图将属性名解释为列表索引,但失败了。如果列表的普通bean属性存在,如何访问它们

更新

我有自己的课

public class Directory extends AbstractList<File> {

    ...

    public Date getInternetLastModified() {
       return internetLastModified;
    }

正如您所看到的,这个类既是列表,又有各自的属性

当我用XML写作时:

${directory.internetLastModified}

我得到了NumberFormatException。我解释了这一点,因为一个对象是一个列表,EL试图做一些类似的事情

out.print(directory.get( String.valueOf("internetLastModified" ) )

所以我要问这个问题


共 (1) 个答案

  1. # 1 楼答案

    假设internetLastModified是一个实例方法,创建了一个简单的目录类,并尝试使用SpelExpressionParser查看发生了什么

    public class DirectoryExamplesMain {
    
        public static final void main(String[] args) {
            ExpressionParser parser = new SpelExpressionParser();
            org.springframework.expression.Expression exp = null;
    
            Directory dir = new Directory();
    
            // Literal
            exp = parser.parseExpression("internetLastModified");
            Date d = exp.getValue(dir, Date.class);
            System.out.format("internetLastModified", d);
    
    
        }
    }
    

    我得到的结果是internetLastModified [Fri May 03 15:40:44 CDT 2013]

    如果directory是一个bean,那么考虑一下使用"@directory.internetLastModified"作为表达式需要什么。您可以在参考手册的第7.5节中找到类似的示例

    这里有一个简单的测试方法

    import java.util.Date;
    
    import org.springframework.expression.AccessException;
    import org.springframework.expression.BeanResolver;
    import org.springframework.expression.EvaluationContext;
    import org.springframework.expression.ExpressionParser;
    import org.springframework.expression.spel.standard.SpelExpressionParser;
    import org.springframework.expression.spel.support.StandardEvaluationContext;
    
    public class DirectoryExamplesMain {
    
        public static final void main(String[] args) {
            final ExpressionParser parser = new SpelExpressionParser();
    
        // Bean references
        final StandardEvaluationContext context = new StandardEvaluationContext();
        context.setBeanResolver(
            new BeanResolver() {
            @Override
            public Object resolve(EvaluationContext arg0, String arg1)
                throws AccessException {
                 return new Directory();
        }});
    
        System.out.format("%s [%s]%n","@directory.internetLastModified",  parser.parseExpression("@directory.internetLastModified").getValue(context));
    }