Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JAXRS中将字段标记为不由JAXB扩展_Java_Json_Web Services_Jaxb_Jax Rs - Fatal编程技术网

Java 如何在JAXRS中将字段标记为不由JAXB扩展

Java 如何在JAXRS中将字段标记为不由JAXB扩展,java,json,web-services,jaxb,jax-rs,Java,Json,Web Services,Jaxb,Jax Rs,我有两门课,如下所示: @XmlRootElement @PersistenceCapable(detachable="true") public class User { @Persistent(primaryKey="true", valueStrategy=IdGeneratorStrategy.IDENTITY) private Long id; private String firstname; private String lastname;

我有两门课,如下所示:

@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;
...
}

我只需要检索user对象,而不需要在一个JAXRS函数中包含userdetails,在另一个JAXRS函数中包含user对象及其附加的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;
}
//UserManager.java
公共列表getUsers(){
javax.jdo.Query q=pm.newQuery(“从“+User.class.getName()中选择”);
List users=(List)q.execute();
返回用户;
}
以及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 ?????
}
@GET
@产生({MediaType.APPLICATION_JSON})
public List getUsers(){//检索所有用户和用户详细信息
UserManager um=new UserManager();//工作正常
返回um.getUsers();
}
@得到
@产生({MediaType.APPLICATION_JSON})
public List getUsers(){//应该只检索用户,但如何检索?
UserManager um=newusermanager();
返回?????
}

如何防止UserDetails对象被第二个函数的JAXRS和JAXB扩展?

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

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

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

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

为您的用户详细信息创建一个命名的获取组,例如

@FetchGroup(name="details", members={@Persistent(name="userDetails")})
当您想要所有东西时,您不必在技术上做任何事情,因为JAXB正在图形中导航,但要完成此操作,您需要指定此提取计划,并使返回的对象在提取计划之后处于瞬态状态,例如:

pm.getFetchPlan().addGroup("details");
[...]
return (List<User>)pm.makeTransientAll(um.getUsers(), true); // use fetch plan
pm.getFetchPlan().addGroup(“详细信息”);
[...]
return(List)pm.makeTransiental(um.getUsers(),true);//使用提取计划
当需要浅层提取时,请使用默认提取计划,并使返回的对象暂时化,例如:

return (List<User>)pm.makeTransientAll(um.getUsers(), true); // use fetch plan
return(List)pm.makeTransiental(um.getUsers(),true);//使用提取计划

希望有帮助。

我该怎么做?你能举个例子吗?对不起,由于时间关系,我无法键入完整的例子。我建议使用一些jpa功能只填充基本用户数据,而不填充userdetails。如果是紧急的,则在填充数据后将null分配给userdeatils引用,直到找到正确的code.yup,@lokesh,这就是我所想的,但在这里,用户是DataNucleus JDO实体。问题是,我不知道在查询数据库时如何省去userdetails。更新:我认为jdo继承在这里可以工作,尽管我不确定它是如何完成的。更新:我通过使用@heritation(customStrategy=“complete table”)拆分用户类来实现它。但是,现在,我无法将详细信息显示在一起。
return (List<User>)pm.makeTransientAll(um.getUsers(), true); // use fetch plan