我已经玩了几个星期Neo4j 2.0 RC1.我正在使用Neo4j作为数据库编写Spring Security实现.当我加载用户时,我从Neo4j得到的响应如下所示:
{
"columns" : [ "username", "password", "accountNonExpired","accountNonLocked", "credentialsNonExpired", "enabled" ],
"data" : [ [ "admin", "admin", true, false, true, false ]
}
Run Code Online (Sandbox Code Playgroud)
最初只返回用户名和密码(两个字符串)和我能够执行此操作的字段:
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);
Run Code Online (Sandbox Code Playgroud)
当然,当我添加其他字段(布尔)时,我需要将Result更改为如下所示:
class Result
{
private List<String> columns = new ArrayList<String>();
private List<ArrayList<Object>> data = new ArrayList<ArrayList<Object>>();
};
Run Code Online (Sandbox Code Playgroud)
我的代码仍然有效,但是当我尝试将任何数据项转换为String或Boolean时,我得到了"未能将对象转换为..."异常.这当然是因为没有类型信息,所以GSon正在创建Object实例来放置它.
所以我猜测必须有更好的方法来处理从Neo4j返回的JSON?
我可以以某种方式跳过JSON转换阶段并让Jersey HTTP客户端直接填充我的User对象吗?
问题是数据没有作为地图返回。
我通常这样做:
columns列表data来获取每个row您还可以向用户对象添加一个工厂方法,该方法获取这些结果之一rows并构造您的用户对象。
例如
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;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在 Neo4j 2.0 中尝试使用事务端点并返回节点对象(它将仅返回节点属性作为映射),然后您可以使用 Gson 或 Jackson 直接将其映射到对象(行)。
match (u:User {username:{username}})
return u
Run Code Online (Sandbox Code Playgroud)
否则你也可以使用 Neo4j 2.0 中的文字映射语法
match (u:User {username:{username}})
return {username : u.username, password: u.password, ....} as user
Run Code Online (Sandbox Code Playgroud)