Json 实体';尽管从互联网上尝试了一百万个想法,但s列表并没有在JAX-RS中使用JPA进行序列化
我有一个简单的JAX-RS2Web服务,其中包含一个客户实体,客户可能没有或更多的地址实体与之关联。在我们服务的findAll()方法中,我们希望只返回每个客户中的数据,而不序列化地址。这是完美的工作 在find(longid)方法中,我们希望返回一个具有所有is地址的特定客户。我尝试了一百万种方法,但似乎无法让客户序列化其地址。当我在调试器中查看find()找到的实体(代码如下)时,它将列表addressList显示为“(IndirectList)“size=3”,因此我希望整个实体和列表都将序列化,但没有发生。我们有一个编写器拦截器(代码如下)用于满足某些特定要求。在其中,我调用procedure(),因此实体由Jackson序列化。序列化之后,我查看json字符串,它只序列化了客户…没有地址。我想我可能需要在序列化之前强制加载地址,所以我调用了getAddressList()方法,但它没有帮助 我完全不知道我做错了什么…我真的很感激你在这个问题上的帮助 感谢您的时间和建议 迈克Json 实体';尽管从互联网上尝试了一百万个想法,但s列表并没有在JAX-RS中使用JPA进行序列化,json,jpa,jaxb,jackson,jax-rs,Json,Jpa,Jaxb,Jackson,Jax Rs,我有一个简单的JAX-RS2Web服务,其中包含一个客户实体,客户可能没有或更多的地址实体与之关联。在我们服务的findAll()方法中,我们希望只返回每个客户中的数据,而不序列化地址。这是完美的工作 在find(longid)方法中,我们希望返回一个具有所有is地址的特定客户。我尝试了一百万种方法,但似乎无法让客户序列化其地址。当我在调试器中查看find()找到的实体(代码如下)时,它将列表addressList显示为“(IndirectList)“size=3”,因此我希望整个实体和列表都将
====================================================================
==========================================技术===========================
====================================================================
NetBeans IDE 8.0(构建201403101706)
Java 1.8.0_11;Java热点(TM)64位服务器VM 25.11-b03
JPA2.1
JAX2
Jackson Json 2.4.2
GlassFish服务器4
MySQL社区服务器5.6.20(引擎=InnoDB)
====================================================================
////////////////////////////////////////////////////////
//客户类别
////////////////////////////////////////////////////////
@实体
@表(name=“客户”)
@XmlRootElement
公共类Customer实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@基本(可选=假)
@XmlAttribute(必需=true)
@列(name=“Id”)
私人长id;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“customerId”,fetch=FetchType.LAZY)
私人名单地址名单;
@XmlTransient
公共列表getAddressList(){
返回地址列表;
}
公共无效设置地址列表(列表地址列表){
this.addressList=地址列表;
}
}
///////////////////////////////////////////////////
//通过ID查找客户
///////////////////////////////////////////////////
//查询以按id查找实体。
受保护的T查找(对象id){
//找到目标
javax.persistence.criteria.CriteriaBuilder cb=getEntityManager().getCriteriaBuilder();
javax.persistence.CriteriaQuery.CriteriaQuery cq=cb.createQuery(entityClass);
javax.persistence.criteria.Root-from=cq.from(entityClass);
javax.persistence.CriteriaQuery select=cq.select(from);
式中(cb.equal(from.get(“id”),id));
javax.persistence.TypedQuery tq=getEntityManager().createQuery(选择);
返回getSingleResultOrNull(tq);
}
///////////////////////////////////////////////////////////////
//写截取器
///////////////////////////////////////////////////////////////
@提供者
公共类MyWriterInterceptor实现WriterInterceptor{
@凌驾
WriteTo周围的公共无效(WriterInterceptorContext上下文)
抛出IOException、WebApplicationException{
final OutputStream originalStream=context.getOutputStream();
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
setOutputStream(BAS);
尝试
{
//是否在序列化之前强制加载地址列表?
//在调试器中,它用“(间接列表)”size=3显示数据
//此强制操作没有使集合序列化为JSON。
对象实体=context.getEntity();
客户=(客户)实体;
//强制加载延迟加载。
customer.getAddressList().size();
context.procedure();
}
捕获(例外情况除外)
{
System.out.println(例如getCause());
}
////////////////////////////////////////////////////////////////////////////
//扫描生成的json以满足某些特定要求。。。
////////////////////////////////////////////////////////////////////////////
//写入并恢复原始流。
baos.writeTo(原始流);
baos.close();
setOutputStream(originalStream);
}
您在地址上使用@xmltransive
有什么原因吗?嗨,约翰,谢谢您的回复!据我所知,@xmltransive用于告诉序列化程序在访问某个项之前不要包含该项。当它应用于getter()时,意味着当getter()在我的帖子中,我展示了我使用了getter(),但地址仍然没有序列化。经过2天的努力和调试后,我一次又一次地被难倒了……希望我能在这里得到一些新的想法。:)好的,谢谢。你对@xmltransite
的理解是错误的。你能删除它,然后再试一次吗?嗨,约翰,我从e getAddressList()方法并重新构建/重新部署。我得到了与以前相同的结果…:(我很感激其他想法。)谢谢!好的-我误解了你的问题。你在使用JSON或XML?你如何使用Jackson2?你注册了自定义MessageBodyWriter
==================================================================== =========================== TECHNOLOGIES =========================== ==================================================================== NetBeans IDE 8.0 (Build 201403101706) Java 1.8.0_11; Java HotSpot(TM) 64-Bit Server VM 25.11-b03 JPA2.1 JAX2 Jackson Json 2.4.2 GlassFish Server 4 MySQL Community Server 5.6.20 (ENGINE=InnoDB) ==================================================================== //////////////////////////////////////////////////////// // CUSTOMER CLASS //////////////////////////////////////////////////////// @Entity @Table(name = "customers") @XmlRootElement public class Customer implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @XmlAttribute(required=true) @Column(name = "Id") private Long id; @OneToMany(cascade = CascadeType.ALL, mappedBy = "customerId", fetch = FetchType.LAZY) private List<Address> addressList; @XmlTransient public List<Address> getAddressList() { return addressList; } public void setAddressList(List<Address> addressList) { this.addressList = addressList; } } /////////////////////////////////////////////////// // FIND A CUSTOMER BY ID /////////////////////////////////////////////////// // Query to find an entity by id. protected T find(Object id) { // Find the object javax.persistence.criteria.CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); javax.persistence.criteria.CriteriaQuery<T> cq = cb.createQuery(entityClass); javax.persistence.criteria.Root<T> from = cq.from(entityClass); javax.persistence.criteria.CriteriaQuery<T> select = cq.select(from); cq.where(cb.equal(from.<T>get("id"), id)); javax.persistence.TypedQuery<T> tq = getEntityManager().createQuery(select); return getSingleResultOrNull(tq); } /////////////////////////////////////////////////////////////// // WRITER INTERCEPTOR /////////////////////////////////////////////////////////////// @Provider public class MyWriterInterceptor implements WriterInterceptor { @Override public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException { final OutputStream originalStream = context.getOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); context.setOutputStream(baos); try { // FORCE THE ADDRESS LIST TO LOAD BEFORE SERIALIZATION? // IN THE DEBUGGER IT SHOWS DATA WITH "(IndirectList) "size = 3" // THIS FORCING DID NOT MAKE THE COLLECTION SERIALIZE TO JSON. Object entity = context.getEntity(); Customer customer = (Customer) entity; // Force lazy load to be loaded. customer.getAddressList().size(); context.proceed(); } catch (Exception ex) { System.out.println(ex.getCause()); } //////////////////////////////////////////////////////////////////////////// // Doing a scan of the generated json to meet some specific requirements... //////////////////////////////////////////////////////////////////////////// // Write to and restore the original Stream. baos.writeTo(originalStream); baos.close(); context.setOutputStream(originalStream); }