我已经玩Neo4j 2.0 RC1几周了。我正在使用Neo4j作为数据库编写Spring Security实现。当我加载用户时,我从Neo4j得到的响应如下所示:
{
"columns" : [ "username", "password", "accountNonExpired","accountNonLocked", "credentialsNonExpired", "enabled" ],
"data" : [ [ "admin", "admin", true, false, true, false ]
}
最初只返回用户名和密码(两个字符串)并且我能够执行此操作的字段:
class Result
{
private List<String> columns = new ArrayList<String>();
private List<ArrayList<String>> data = new ArrayList<ArrayList<String>>();
};
ClientRespose resp = webResource.path(path).type(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, body );
String s = response.getEntity(String.class);
Result r = new Gson().fromJson(s, Result.class);
当然,当我添加其他字段(布尔值)时,我需要将Result更改为如下所示:
class Result
{
private List<String> columns = new ArrayList<String>();
private List<ArrayList<Object>> data = new ArrayList<ArrayList<Object>>();
};
我的代码仍然有用,但是当我尝试将任何数据项强制转换为String或Boolean时,我得到了“未能将对象强制转换为...”异常。这当然是因为没有类型信息,所以GSon正在创建Object实例来放置它。
所以我猜测必须有更好的方法来处理从Neo4j返回的JSON?
我可以以某种方式跳过JSON转换阶段并让Jersey HTTP客户端直接填充我的User对象吗?
答案 0 :(得分:2)
问题是数据不会以地图形式返回。
我通常这样做:
columns
列表data
上使用for循环获取每个row
您还可以向用户Object添加工厂方法,以获取其中一个结果rows
并构建您的User对象。
e.g。
class User {
public static User from(List<Object> row) {
User u=new User((String)row.get(0),(String)row.get(1));
u.setAccountNonExpired((Boolean)row.get(2));
u.setAccountNonLocked((Boolean)row.get(3));
u.setCredentialsNonExpired((Boolean)row.get(4));
u.setEnabled((Boolean)row.get(5));
return u;
}
}
你可以尝试使用Neo4j 2.0的东西是使用事务端点并返回节点对象(它只返回节点属性作为地图),然后你可以直接用Gson或Jackson映射到一个对象(行)。
match (u:User {username:{username}})
return u
否则您也可以使用Neo4j 2.0中的文字地图语法
match (u:User {username:{username}})
return {username : u.username, password: u.password, ....} as user