1

我有2个课程如下:

@XmlRootElement
@PersistenceCapable(detachable="true")
public class User {

    @Persistent(primaryKey="true", valueStrategy=IdGeneratorStrategy.IDENTITY)
    private Long id;

    private String firstname;
    private String lastname;
    private UserDetails userDetails;
...
}

@XmlRootElement
@PersistenceCapable(detachable="true")
public class UserDetails {
    private String streetaddress;
    private String address;
    private String city;
    private int pincode;
    private Date dateofbirth;
...
}

我只需要检索用户对象,而不需要在一个 JAXRS 函数中包含 userdetails,并且在另一个 JAXRS 函数中包含用户对象及其附加的 userdetails 对象,如图所示。

//UserManager.java
public List<User> getUsers() {
    javax.jdo.Query q = pm.newQuery("SELECT FROM "+ User.class.getName());
    List<User> users = (List<User>) q.execute();
    return users;
}

和 JAXRS 服务:

@GET
@Produces({MediaType.APPLICATION_JSON})  
public List<User> getUsers() {        //Retrieves all users and user details
    UserManager um=new UserManager(); //working perfectly
    return um.getUsers();
}

@GET
@Produces({MediaType.APPLICATION_JSON})  
public List<User> getUsers() {        //should retrieve user only, but how?
    UserManager um=new UserManager();
    return ?????
}

如何防止 UserDetails 对象被 JAXRS 和 JAXB 扩展为第二个功能???

4

2 回答 2

0

您可以结合使用 JDO 获取计划和生命周期策略。

为您的 userDetails 创建一个命名提取组,例如

@FetchGroup(name="details", members={@Persistent(name="userDetails")})

当您想要一切时,您不必在技术上做任何事情,因为 JAXB 正在导航图表,但要完成,您将指定此获取计划并根据获取计划使返回的对象瞬态,例如:

pm.getFetchPlan().addGroup("details");
[...]
return (List<User>)pm.makeTransientAll(um.getUsers(), true); // use fetch plan

当您想要浅提取时,请使用默认提取计划并使您返回的对象瞬态,例如:

return (List<User>)pm.makeTransientAll(um.getUsers(), true); // use fetch plan

希望能帮助到你。

于 2013-01-29T18:31:41.093 回答
0

如果您从两个函数返回相同的类型,那么 jaxb 无法帮助您从一种方法中隐藏信息并在第二种方法中显示。

有两种方法可以实现这一点:

1)要么从不聚合用户详细信息的第二个函数返回不同的用户对象。2) 在第二个函数中编写一个不填充用户详细信息数据的查询。

于 2013-01-28T09:38:20.207 回答