Json 实体';尽管从互联网上尝试了一百万个想法,但s列表并没有在JAX-RS中使用JPA进行序列化

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”,因此我希望整个实体和列表都将

我有一个简单的JAX-RS2Web服务,其中包含一个客户实体,客户可能没有或更多的地址实体与之关联。在我们服务的findAll()方法中,我们希望只返回每个客户中的数据,而不序列化地址。这是完美的工作

在find(longid)方法中,我们希望返回一个具有所有is地址的特定客户。我尝试了一百万种方法,但似乎无法让客户序列化其地址。当我在调试器中查看find()找到的实体(代码如下)时,它将列表addressList显示为“(IndirectList)“size=3”,因此我希望整个实体和列表都将序列化,但没有发生。我们有一个编写器拦截器(代码如下)用于满足某些特定要求。在其中,我调用procedure(),因此实体由Jackson序列化。序列化之后,我查看json字符串,它只序列化了客户…没有地址。我想我可能需要在序列化之前强制加载地址,所以我调用了getAddressList()方法,但它没有帮助

我完全不知道我做错了什么…我真的很感激你在这个问题上的帮助

感谢您的时间和建议

迈克

====================================================================
==========================================技术===========================
====================================================================
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);
    }