Java 尝试返回JSON时,Jax RS错误500,无异常
我正试图找到一个有两个一对一关系的实体。当我尝试在API上获取时,服务器打印一个错误500,没有更多指示。 我认为问题来自JSON格式,因为当我尝试使用XML时,它是有效的。 这两个案例似乎有相同的问题,但解决方案对我不起作用: 实体: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
/**
* 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?我从来没有那样做过,你呢