我已经使用Postman API客户端测试了REST服务,该客户端将JSON对象传递给服务。
JSON对象
{
"username" : "user",
"password" : "pass"
}
正确完成到Java对象的映射,并以响应状态200返回。
如何在对REST服务方法的操作中完成Java对象映射的JSON对象。
UserCl Class
static class UserCl{
private String uname;
private String password;
private String name;
public UserCl(){
}
public String getName() {
return name;
}
public void setName(String pname) {
this.name = pname;
}
public String getUsername() {
return uname;
}
public void setUsername(String pusername) {
this.uname = pusername;
}
public String getPassword() {
return password;
}
public void setPassword(String ppassword) {
this.password = ppassword;
}
}
REST服务方法
@PermitAll
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Path("/auth")
public Response login(UserCl usr){
if(usr.getUsername().compareTo("user") == 0 && usr.getPassword().compareTo("pass") == 0){
String usernameAndPassword = usr.getUsername() + ":" + usr.getPassword();
try {
String base64String = Base64Encoder.encode(usernameAndPassword);
System.out.println(base64String);
return Response.status(200).build();
} catch (IOException e) {
e.printStackTrace();
return Response.status(401).build();
}
}
else{
return Response.status(401)build();
}
}
答案 0 :(得分:2)
Resteasy默认使用杰克逊。基本行为(与大多数序列化框架一样)是查找JavaBean属性(getters / setters)。对于反序列化,setter是内省的。他们应该遵循JavaBean naming convention。如果你的情况
private String username;
public void setUsername(String string) {}
从方法名称中删除set
,并将第一个字母缩小。因此setUsername
映射到"username"
JSON属性。
序列化时,将使用getter。就像反序列化一样,get
被剥离,第一个字母更低。因此getUsername
会在生成的JSON中添加"username"
属性。
也可以使用Jackson注释来更改属性名称。例如
@JsonProperty("name")
private String username;
但是这需要你将Jackson作为编译时依赖项添加到你的项目中。
修改强>
只是在杰克逊补充说,我们不 使用JavaBean属性。即使使用公共字段,也将使用字段的名称。不是真的推荐,只是想我把它扔出去。
答案 1 :(得分:1)
通常使用反射来实现。 Java能够使用其名称访问对象的方法和字段。这称为反射。在您的情况下,您正在使用的JSON库具有这种魔力。
首先,它找到必须实例化的类。它从方法login()
的参数类型中获取。它使用像
Class.forName("UserCl").newInstance()
(这需要公共默认构造函数。您的类没有定义任何构造函数,因此隐式地有一个默认构造函数。)
然后它会发现类UserCl
,找到setPassword()
和setUsername()
并调用它们传递适当JSON属性的值。
有关java reflection API的更多信息,请参阅。