[英]How to return XML/JSON representation without the entity ID or a given attribute in JAX-RS at runtime?
考虑这个实体:
@Entity
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class User {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private int id;
private String username;
private String password;
// getters and setters
}
@Path("/users")
@Stateless
@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
public class UserService {
@GET
@PATH("all")
//return list of all usernames
@GET
@PATH("{id}"}
//get a single user object
}
现在xml或JSON返回包含id元素; 即
<user>
<id>343</id>
<username>name</username>
<password>pwd</password>
</user>
Q1)问题是在资源生成期间(当GET
请求进入时),是否有可能从返回xml对象中删除id
元素。 在这里,我知道在部署时我想从xml中删除id属性。
我可以做以下事情; 但是问题是我必须在更改其ID属性之前先分离该实体,并且我不确定该如何完成(因为它是容器管理的)
@GET
@Path("{id}")
public User getUser(@PathParam("id") int id){
User u = u=em.find(User.class, id);
//detach the object u
u.setId(-9999)
return u;
}
Q2)更高一步,是否有可能根据运行时所需的属性返回User对象,例如: www.foo.com/users/1?att=username
。
在这里,我指定仅需要ID为1的User对象的属性用户名。在我的GET请求方法中,我可以执行以下操作,但是这对我来说很脆弱。 我想有一个更清洁的解决方案。
@GET
@Path("{id}")
public User getUser(@PathParam("id") int id, @QueryParam("att") String attribute){
User u = u=em.find(User.class, id);
User u2= null;
if (attribute==null){
return u;
}
else if (att="id") {
u2.setUserName(u.getUserName());
u2.setUserPassword(u.getUserPassword());
} else if (att="password"){
//same logic as above
} else if (att="username") {
}
return u2;
}
}
谢谢
“ Q1)问题是在资源生成期间(当GET请求进入时),是否可以从返回xml对象中删除id元素。在这里,我知道在部署时我想从xml中删除id属性”。
您可以简单地使用@XmlTransient
@XmlTransient
批注对于解决JavaBean属性名称和字段名称之间的名称冲突或防止字段/属性的映射非常有用。
@Id
@XmlTransient
@GeneratedValue(strategy= GenerationType.AUTO)
private int id;
“ Q2)更高一步,是否有可能根据运行时所需的属性返回User对象,例如:
www.foo.com/users/1?att=username
”
就这个问题而言,除了您当前正在执行的操作(假设您仍然需要xml响应)之外,我没有看到任何真正的“优雅”方式来做到这一点
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.