2017-02-24 7 views
0

콩을 Gson을 통해 json으로 변환하려고합니다. 내 bean (Logs)은 다른 bean (Log)과 첫 번째 bean에 대한 두 번째 bean 참조를 포함합니다.Java에서 참조 빈을 json으로 변환하는 방법은 무엇입니까?

@Entity 
@Table(name = "t_logs") 
public class Logs { 

    @Id 
    @Column(name = "executionid") 
    private String executionId; 

    @Column(name = "sentdate") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date sentDate; 

    @Column(name = "sent") 
    private boolean sent; 

    @OneToMany(mappedBy = "logs", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private List<Log> logList;} 


@Entity 
@Table(name = "t_log") 
public class Log { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private long id; 

    @ManyToOne 
    @JoinColumn(name = "executionid") 
    private Logs logs; 

    @Column(name = "startdate") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date startDate; 

    @Column(name = "enddate") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date endDate; 
    } 

그래서 Json 형식을 변환하려고하면 위와 같은 오류가 발생합니다. java.lang.StackOverflowError의는

나는이주기 생각하지만 난 그것을 해결하는 방법을, 나는

 Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create(); 
     return gson.toJson(logs, Logs.class); 

답변

0

나는 그것이 최악이라는 것을 알고 있지만 나는 어떤 방법을 찾을 수 없었다!

private String convertToMyJSON(Logs logs) { 

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 

    String jsonObject = "{" 
      + "\"executionId\":\"" + logs.getExecutionId() + "\"," 
      + "\"startDate\":\"" + sdf.format(logs.getStartDate()) + "\"," 
      + "\"logList\":[" + getLogString(logs) + "]" 
      + "}"; 

    return jsonObject; 
} 

private String getLogString(Logs logs) { 

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 

    String logString = ""; 

    for (Log l : logs.getLogList()) { 

     logString = logString 
       + "{" 
       + "\"id\":" + l.getId() + "," 
       + "\"executionId\":\"" + logs.getExecutionId() + "\"," 
       + "\"startDate\":\"" + sdf.format(l.getStartDate()) + "\"," 
       + "\"endDate\":\"" + sdf.format(l.getEndDate()) + "\"," 
       + "},"; 
    } 

    return logString.substring(0, logString.lastIndexOf(",")); 
} 
0

당신은 로그와 로그 사이의 순환 참조를 모른다.

로그를 Json으로 변환하려고하면 참조 된 로그뿐만 아니라 로그도 변환됩니다. 그러나 로그에는 로그에 대한 참조가 있으며 로그에는 다시 로그에 대한 참조가 있습니다. 따라서 스택은 무한히 커지고 한 지점에서 오버 플로우됩니다.

로그에서 로그 참조를 제거하거나 그것을

+0

주석을 무시 하시겠습니까? –

+0

Gson에서 필드를 제외하려면 여기 옵션을 확인하십시오. http://howtoprogram.xyz/2016/10/16/ignore-or-exclude-field-in-gson/ –

+0

@Selvakumar, 고맙습니다.하지만 제출해야합니다. 로그 bean (executionId) –

0

을 무시하는 몇 가지 주석을 추가 어느 당신은 무한 루프를 방지하기 위해 로그의 'logList'을 무효화해야합니다. 당신은하고 로그를 가져 오는하고 열심히 당신이 끝이 없을 것입니다, 그래서 그것의 연속 검색을하고 분명 너무 로그인을 가져 오는, 그래서 내가 다음은 "@ManyToOne"을 제거하기 위해 제안하고있어이

Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create(); 
logs.getLogs.setLogList(null); 
return gson.toJson(logs, Logs.class); 
+0

에 log.executionid setted null을 제안 할 때 서버 측 db에서 이러한 데이터 executionid가 null이됩니다. (참조 없음) –

0

같은 시도 로그 엔티티의 관계.

@ManyToOne 
@JoinColumn(name = "executionid") 
private Logs logs; 
+0

ManyToOne을 제거했을 때 위와 같은 오류가 발생했습니다. init 메소드의 호출이 실패했습니다. 중첩 예외는 org.hibernate.MappingException입니다 : 유형을 판별 할 수 없습니다 : net.mycompany.model.Logs –