jexl输出实体类某个属性的值

dream_maker2333 2017-01-17 05:00:26
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.jexl2.Expression;
import org.apache.commons.jexl2.JexlContext;
import org.apache.commons.jexl2.JexlEngine;
import org.apache.commons.jexl2.MapContext;


public class jexl {
public static void main(String[] args) {
List<Object> list = new ArrayList<Object>();
Student student = new Student("hah");
list.add(student);
for(Object obj : list){
Map<String,Object> map = new HashMap<String,Object>();
JexlEngine jexlEngine = new JexlEngine();
Expression expression = jexlEngine.createExpression("e.name");
map.put("e", obj);
JexlContext content = new MapContext(map);
System.out.println(expression.evaluate(content));
}
}

}
class Student implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;

public Student(String name) {
super();
this.name = name;
}

public Student() {
super();
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "Student [name=" + name + "]";
}

}

现在这个会报错,找不到e.name...
一月 17, 2017 4:44:54 下午 org.apache.commons.jexl2.Interpreter unknownVariable
警告: jexl.main@21![0,6]: 'e.name;' inaccessible or unknown property e
null


我想知道如何才能输出Student类中name的属性值 hah ???有木有大神出手相救啊
...全文
342 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
scarlett_ry 2017-06-27
  • 打赏
  • 举报
回复
谢谢,遇到了同样的问题,果然改成public类就可以了
dream_maker2333 2017-01-18
  • 打赏
  • 举报
回复
成功输出:hah 33
dream_maker2333 2017-01-18
  • 打赏
  • 举报
回复
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.jexl2.JexlContext;
import org.apache.commons.jexl2.JexlEngine;
import org.apache.commons.jexl2.MapContext;
import org.apache.commons.jexl2.Expression;



public class jexl {
	public static void main(String[] args) {
        List<Object> list = new ArrayList<Object>();
        Student student = new Student("22","hah");
        Teacher teacher = new Teacher("11","33");
        list.add(student);
        list.add(teacher);
        for(Object obj : list){
		    Map<String,Object> map = new HashMap<String,Object>();
		    JexlEngine jexlEngine = new JexlEngine();
		    jexlEngine.setSilent(true);
		    Expression expression = jexlEngine.createExpression("e.orgName");
	        JexlContext content = new MapContext();
	        content.set("e", obj);
	        System.out.println(expression.evaluate(content));
	    }
	}
}
import java.io.Serializable;

public class Student implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String orgNo;
	private String orgName;
	
	public Student(String orgNo, String orgName) {
		super();
		this.orgNo = orgNo;
		this.orgName = orgName;
	}

	public Student() {
		super();
	}

	public String getOrgNo() {
		return orgNo;
	}

	public void setOrgNo(String orgNo) {
		this.orgNo = orgNo;
	}

	public String getOrgName() {
		return orgName;
	}

	public void setOrgName(String orgName) {
		this.orgName = orgName;
	}

	@Override
	public String toString() {
		return "Student [orgNo=" + orgNo + ", orgName=" + orgName + "]";
	}

}

public class Teacher {
	/**
	 * 
	 */
	@SuppressWarnings("unused")
	private static final long serialVersionUID = 1L;
	private String orgNo;
	private String orgName;
	public Teacher() {
		super();
	}
	public Teacher(String orgNo, String orgName) {
		super();
		this.orgNo = orgNo;
		this.orgName = orgName;
	}
	public String getOrgNo() {
		return orgNo;
	}
	public void setOrgNo(String orgNo) {
		this.orgNo = orgNo;
	}
	public String getOrgName() {
		return orgName;
	}
	public void setOrgName(String orgName) {
		this.orgName = orgName;
	}
	@Override
	public String toString() {
		return "Teacher [orgNo=" + orgNo + ", orgName=" + orgName + "]";
	}
	
}
dream_maker2333 2017-01-18
  • 打赏
  • 举报
回复
引用 6 楼 soton_dolphin 的回复:
[quote=引用 5 楼 huqingpeng321 的回复:] [quote=引用 4 楼 soton_dolphin 的回复:]

List<Student> list = new ArrayList<>();
        Student student = new Student("hah");
        list.add(student);
        for(Student : s){
            Map<String,Object> map = new HashMap<String,Object>();
            JexlEngine jexlEngine = new JexlEngine();
            Expression expression = jexlEngine.createExpression("e");
            map.put("e", s.getName());
            JexlContext content = new MapContext(map);
            System.out.println(expression.evaluate(content));
        }

你的这个意思我知道,我的想法是把Student泛型话成一个Object类,只要这个Object类中有这个字段 name ,那么就输出这个name属性的值,也就是说,我后面的操作不仅仅是Student类,也可能是Teacher啊之类的。可以共用这一段代码 谢了辛苦了,能不能这么操作[/quote] Object 类 不会有name属性。你需要一个借口比如 nameable, 所有需要getName()方法的类都implement 这个借口,用这个接口作为泛型的参数类[/quote] 你说的也没错,但是jexl表达式会自动识别Object类(其它类例如Student向上造型为Object)中有哪些变量属性的,匹配到了以后自动获取其中的值。问题我已经解决了,把Student类拿出来加上public修饰符,但是还是不是很明白。 还是很感谢你兄弟
soton_dolphin 2017-01-17
  • 打赏
  • 举报
回复
引用 5 楼 huqingpeng321 的回复:
[quote=引用 4 楼 soton_dolphin 的回复:]

List<Student> list = new ArrayList<>();
        Student student = new Student("hah");
        list.add(student);
        for(Student : s){
            Map<String,Object> map = new HashMap<String,Object>();
            JexlEngine jexlEngine = new JexlEngine();
            Expression expression = jexlEngine.createExpression("e");
            map.put("e", s.getName());
            JexlContext content = new MapContext(map);
            System.out.println(expression.evaluate(content));
        }

你的这个意思我知道,我的想法是把Student泛型话成一个Object类,只要这个Object类中有这个字段 name ,那么就输出这个name属性的值,也就是说,我后面的操作不仅仅是Student类,也可能是Teacher啊之类的。可以共用这一段代码 谢了辛苦了,能不能这么操作[/quote] Object 类 不会有name属性。你需要一个借口比如 nameable, 所有需要getName()方法的类都implement 这个借口,用这个接口作为泛型的参数类
dream_maker2333 2017-01-17
  • 打赏
  • 举报
回复
引用 4 楼 soton_dolphin 的回复:

List<Student> list = new ArrayList<>();
        Student student = new Student("hah");
        list.add(student);
        for(Student : s){
            Map<String,Object> map = new HashMap<String,Object>();
            JexlEngine jexlEngine = new JexlEngine();
            Expression expression = jexlEngine.createExpression("e");
            map.put("e", s.getName());
            JexlContext content = new MapContext(map);
            System.out.println(expression.evaluate(content));
        }

你的这个意思我知道,我的想法是把Student泛型话成一个Object类,只要这个Object类中有这个字段 name ,那么就输出这个name属性的值,也就是说,我后面的操作不仅仅是Student类,也可能是Teacher啊之类的。可以共用这一段代码 谢了辛苦了,能不能这么操作
soton_dolphin 2017-01-17
  • 打赏
  • 举报
回复

List<Student> list = new ArrayList<>();
        Student student = new Student("hah");
        list.add(student);
        for(Student : s){
            Map<String,Object> map = new HashMap<String,Object>();
            JexlEngine jexlEngine = new JexlEngine();
            Expression expression = jexlEngine.createExpression("e");
            map.put("e", s.getName());
            JexlContext content = new MapContext(map);
            System.out.println(expression.evaluate(content));
        }

dream_maker2333 2017-01-17
  • 打赏
  • 举报
回复
没明白。。。。。
dream_maker2333 2017-01-17
  • 打赏
  • 举报
回复
引用 1 楼 soton_dolphin 的回复:
e 是个map的键,是一个字符串啊
如果我改成 Expression expression = jexlEngine.createExpression("name"); map.put("name", obj); 这种的话,直接就输出这个Student [name=hah]了,我想只要hah这个值,不知怎么操作??
soton_dolphin 2017-01-17
  • 打赏
  • 举报
回复
e 是个map的键,是一个字符串啊

50,503

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧