Java 尝试返回JSON时,Jax RS错误500,无异常

Java 尝试返回JSON时,Jax RS错误500,无异常,java,json,glassfish,jax-rs,Java,Json,Glassfish,Jax Rs,我正试图找到一个有两个一对一关系的实体。当我尝试在API上获取时,服务器打印一个错误500,没有更多指示。 我认为问题来自JSON格式,因为当我尝试使用XML时,它是有效的。 这两个案例似乎有相同的问题,但解决方案对我不起作用: 实体: /** * Disruptive */ @Entity @Table(name = "disruptive") @XmlRootElement public class Disruptive implements Serializable{ @I

我正试图找到一个有两个一对一关系的实体。当我尝试在API上获取时,服务器打印一个错误500,没有更多指示。 我认为问题来自JSON格式,因为当我尝试使用XML时,它是有效的。 这两个案例似乎有相同的问题,但解决方案对我不起作用:

实体:

/**
 * Disruptive
 */
@Entity
@Table(name = "disruptive")
@XmlRootElement
public class Disruptive implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "disruptive_id_seq")
    @SequenceGenerator(name = "disruptive_id_seq", sequenceName = "disruptive_id_seq", allocationSize = 1)
    @Column(name = "id_disruptive")
    protected Integer idDisruptive;
    private String name;
    private String content;
    @ManyToOne
    @JoinColumn(name = "id_initial_situation", referencedColumnName = "id_initial_situation")
    protected InitialSituation initialSituation;
    @OneToMany(mappedBy = "disruptive") //,cascade = CascadeType.ALL,orphanRemoval = true
    protected List<Event> events;
    @OneToMany(mappedBy = "disruptive")
    protected List<FinalSituation> finalSituations;

    public Disruptive() {

    }

    public Disruptive(InitialSituation initialSituation) {
        this.setInitialSituation(initialSituation);
    }

    public Integer getIdDisruptive() {
        return idDisruptive;
    }

    public void setIdDisruptive(Integer idDisruptive) {
        this.idDisruptive = idDisruptive;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }    

    public InitialSituation getInitialSituation() {
        return initialSituation;
    }

    public void setInitialSituation(InitialSituation initialSituation) {
        this.initialSituation = initialSituation;
    }

    public List<FinalSituation> getFinalSituations() {
        return finalSituations;
    }

    public void setFinalSituations(List<FinalSituation> finalSituations) {
        this.finalSituations = finalSituations;
    }

    public List<Event> getEvents() {
        return events;
    }

    public void setEvents(List<Event> events) {
        this.events = events;
    }

    @Override
    public String toString(){
        return this.getName();
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 53 * hash + Objects.hashCode(this.idDisruptive);
        hash = 53 * hash + Objects.hashCode(this.name);
        hash = 53 * hash + Objects.hashCode(this.content);
        hash = 53 * hash + Objects.hashCode(this.initialSituation);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Disruptive other = (Disruptive) obj;
        if (!Objects.equals(this.name, other.name)) {
            return false;
        }
        if (!Objects.equals(this.content, other.content)) {
            return false;
        }
        if (!Objects.equals(this.idDisruptive, other.idDisruptive)) {
            return false;
        }
        if (!Objects.equals(this.initialSituation, other.initialSituation)) {
            return false;
        }
        return true;
    }
}
/**
*破坏性
*/
@实体
@表(name=“破坏性”)
@XmlRootElement
可序列化的公共类{
@身份证
@GeneratedValue(策略=GenerationType.AUTO,generator=“中断性id\u seq”)
@SequenceGenerator(name=“中断性”id“seq”,sequenceName=“中断性”id“seq”,allocationSize=1)
@列(name=“id\u”)
受保护整数;
私有字符串名称;
私有字符串内容;
@许多酮
@JoinColumn(name=“id\u初始情况”,referencedColumnName=“id\u初始情况”)
受保护的初始情况初始情况;
@OneToMany(mappedBy=“中断”)/,cascade=CascadeType.ALL,orphan=true
受保护列表事件;
@OneToMany(mappedBy=“破坏性”)
受保护清单最终化;
公共事务{
}
公众干扰(初始情况初始情况){
这个.setInitialCondition(InitialCondition);
}
公共整数getIDs(){
回报率;
}
public void setidstructive(整数idstructive){
this.idstructive=idstructive;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getContent(){
返回内容;
}
公共void setContent(字符串内容){
this.content=内容;
}    
public initialCondition getInitialCondition(){
返回状态;
}
公共无效设置初始情况(初始情况初始情况){
this.initial情境=initial情境;
}
公共列表GetFinalInitiations(){
返回最终结果;
}
公共作废集合最终设定(列出最终设定){
this.finalsitations=finalsitations;
}
公共列表getEvents(){
返回事件;
}
公共void setEvents(列出事件){
这个事件=事件;
}
@凌驾
公共字符串toString(){
返回这个.getName();
}
@凌驾
公共int hashCode(){
int hash=7;
hash=53*hash+Objects.hashCode(this.idcode);
hash=53*hash+Objects.hashCode(this.name);
hash=53*hash+Objects.hashCode(this.content);
hash=53*hash+Objects.hashCode(this.initial情境);
返回散列;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj){
返回true;
}
if(obj==null){
返回false;
}
如果(getClass()!=obj.getClass()){
返回false;
}
最终破坏性其他=(破坏性)obj;
如果(!Objects.equals(this.name,other.name)){
返回false;
}
如果(!Objects.equals(this.content,other.content)){
返回false;
}
如果(!Objects.equals(this.idstructive,other.idstructive)){
返回false;
}
如果(!Objects.equals(this.initial情境,other.initial情境)){
返回false;
}
返回true;
}
}
网络服务:

/**
 * DisruptiveFacadeREST
 */
@Stateless
@Path("disruptive")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public class DisruptiveFacadeREST extends AbstractFacade<Disruptive> {

    @PersistenceContext(unitName = "StoryGeneratorPU")
    private EntityManager em;

    public DisruptiveFacadeREST() {
        super(Disruptive.class);
    }

    @POST
    @Override
    public void create(Disruptive entity) {
        super.create(entity);
    }

    @PUT
    @Path("{id}")
    public void edit(@PathParam("id") Integer id, Disruptive entity) {
        super.edit(entity);
    }

    @DELETE
    @Path("{id}")
    public void remove(@PathParam("id") Integer id) {
        super.remove(super.find(id));
    }

    @GET
    @Path("{id}")
    public Disruptive find(@PathParam("id") Integer id) {
        return super.find(id);
    }

    @GET
    @Override
    public List<Disruptive> findAll() {
        return super.findAll();
    }

    @GET
    @Path("random")
    public Disruptive findRandom(@QueryParam("idInitialSituation") Integer idInitialSituation) {
        System.out.println(idInitialSituation);
        Query query;
        query = this.getEntityManager().createQuery("SELECT dis FROM Disruptive dis JOIN dis.initialSituation insi WHERE insi.idInitialSituation = :idInitialSituation");
        query.setParameter("idInitialSituation", idInitialSituation);
        List<Disruptive> list= query.getResultList();
        Disruptive dis = null;
        if (!list.isEmpty()){
            Collections.shuffle(list);
            dis = (Disruptive) list.get(0);
        }
        return dis;
    }

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }
}
/**
*破坏性
*/
@无国籍
@路径(“破坏性”)
@使用({MediaType.APPLICATION_JSON})
@产生({MediaType.APPLICATION_JSON})
公共类DisruptiveFacadeREST扩展了AbstractFacade{
@PersistenceContext(unitName=“StoryGeneratorPU”)
私人实体管理者;
公共干扰中心(){
超级(破坏性类);
}
@职位
@凌驾
公共无效创建(破坏性实体){
超级创建(实体);
}
@放
@路径(“{id}”)
公共无效编辑(@PathParam(“id”)整数id,破坏性实体){
超级编辑(实体);
}
@删除
@路径(“{id}”)
公共无效删除(@PathParam(“id”)整数id){
super.remove(super.find(id));
}
@得到
@路径(“{id}”)
公共中断查找(@PathParam(“id”)整数id){
返回super.find(id);
}
@得到
@凌驾
公共列表findAll(){
返回super.findAll();
}
@得到
@路径(“随机”)
公共中断findRandom(@QueryParam(“idInitialSituation”)整数idInitialSituation){
System.out.println(初始化);
查询;
query=this.getEntityManager().createQuery(“从中断性dis-JOIN dis.initialScience insi中选择dis,其中insi.idInitialScuation=:idInitialScuation”);
query.setParameter(“idInitialSituation”,idInitialSituation);
List=query.getResultList();
破坏性dis=null;
如果(!list.isEmpty()){
集合。洗牌(列表);
dis=(破坏性)list.get(0);
}
返回dis;
}
@凌驾
受保护的EntityManager getEntityManager(){
返回em;
}
}
我使用Glassfish服务器和JAX-RS提供服务。

问题已经解决(我问题下的cfr评论)

所以我应用了这个解决方案:

所以我可以看到堆栈跟踪:

GRAVE:   javax.ws.rs.WebApplicationException: HTTP 500 Internal Server Error
    at org.eclipse.persistence.jaxb.rs.MOXyJsonProvider.writeTo(MOXyJsonProvider.java:959)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:265)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
    at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:106)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:86)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1130)
    at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:711)
    at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:444)
    at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:434)
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:329)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473)
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1692)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:258)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:654)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:593)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:159)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:371)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:238)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:483)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:180)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:539)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:593)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:573)
    at java.lang.Thread.run(Thread.java:748)
Caused by: javax.xml.bind.MarshalException
 - with linked exception:
[Exception [EclipseLink-25037] (Eclipse Persistence Services - 2.6.4.qualifier): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: A cycle is detected in the object graph.  This will cause an infinite loop: Test -> be.isl.prj.story.entity.Event@1a1a69fc -> Test]
    at org.eclipse.persistence.jaxb.JAXBMarshaller.marshal(JAXBMarshaller.java:500)
    at org.eclipse.persistence.jaxb.rs.MOXyJsonProvider.writeTo(MOXyJsonProvider.java:957)
    ... 53 more
Caused by: Exception [EclipseLink-25037] (Eclipse Persistence Services - 2.6.4.qualifier): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: A cycle is detected in the object graph.  This will cause an infinite loop: Test -> be.isl.prj.story.entity.Event@1a1a69fc -> Test
    at org.eclipse.persistence.exceptions.XMLMarshalException.objectCycleDetected(XMLMarshalException.java:415)
    at org.eclipse.persistence.internal.oxm.XPathObjectBuilder.buildRow(XPathObjectBuilder.java:212)
    at org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(TreeObjectBuilder.java:118)
    at org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(TreeObjectBuilder.java:1)
    at org.eclipse.persistence.internal.oxm.XMLCompositeObjectMappingNodeValue.marshalSingleValue(XMLCompositeObjectMappingNodeValue.java:260)
    at org.eclipse.persistence.internal.oxm.XMLCompositeObjectMappingNodeValue.marshal(XMLCompositeObjectMappingNodeValue.java:151)
    at org.eclipse.persistence.internal.oxm.NodeValue.marshal(NodeValue.java:102)
    at org.eclipse.persistence.internal.oxm.record.ObjectMarshalContext.marshal(ObjectMarshalContext.java:59)
    at org.eclipse.persistence.internal.oxm.XPathNode.marshal(XPathNode.java:443)
    at org.eclipse.persistence.internal.oxm.XPathObjectBuilder.buildRow(XPathObjectBuilder.java:243)
    at org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(TreeObjectBuilder.java:118)
    at org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(TreeObjectBuilder.java:1)
    at org.eclipse.persistence.internal.oxm.XMLCompositeCollectionMappingNodeValue.marshalSingleValue(XMLCompositeCollectionMappingNodeValue.java:334)
    at org.eclipse.persistence.internal.oxm.XMLCompositeCollectionMappingNodeValue.marshal(XMLCompositeCollectionMappingNodeValue.java:104)
    at org.eclipse.persistence.internal.oxm.NodeValue.marshal(NodeValue.java:149)
    at org.eclipse.persistence.internal.oxm.NodeValue.marshal(NodeValue.java:102)
    at org.eclipse.persistence.internal.oxm.record.ObjectMarshalContext.marshal(ObjectMarshalContext.java:59)
    at org.eclipse.persistence.internal.oxm.XPathNode.marshal(XPathNode.java:443)
    at org.eclipse.persistence.internal.oxm.XPathObjectBuilder.buildRow(XPathObjectBuilder.java:243)
    at org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(TreeObjectBuilder.java:118)
    at org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(TreeObjectBuilder.java:1)
    at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshal(XMLMarshaller.java:766)
    at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshal(XMLM
GRAVE:   arshaller.java:586)
    at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshalStreamOrWriter(XMLMarshaller.java:1126)
    at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshal(XMLMarshaller.java:934)
    at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshal(XMLMarshaller.java:877)
    at org.eclipse.persistence.jaxb.JAXBMarshaller.marshal(JAXBMarshaller.java:496)
    ... 54 more

我解决了这个问题,将我忘记的@XmlTransient放在我的OneToMany关系的getter中(在破坏性实体中)。

试着看看是否可以通过这种方式获得堆栈跟踪。异常可能被吞没了。我不明白,我在哪里可以注册异常?您没有注册异常。您可以实现ExceptionMapper来捕获异常并对其进行处理。复制并粘贴DebugMapper并将其注册到你的应用程序我如何向我的应用程序注册I?我从来没有那样做过,你呢