簡體   English   中英

使用Gson將BindingResult轉換為JSON時的java.lang.StackOverflowError

[英]java.lang.StackOverflowError while converting BindingResult to JSON using Gson

環境:
春季啟動 - 1.2.3
問題

BindingResult被添加為控制器方法的@Valid參數的下一個參數時,如下所示,繼續獲取java.lang.StackOverflowError

@RequestMapping(value = "/employees", method = RequestMethod.POST, consumes = "application/json")
public void createEmployee(HttpServletRequest request, @Valid @RequestBody Employee employee, BindingResult result){
    logger.debug("Creating Employee [" + employee.getForename() + " " + employee.getSurname() + "]");
}

如果刪除BindingResult方法參數,它可以正常工作。
更新開始
發現此問題,使用以下代碼將BindingResult實例轉換為JSON發生StackOverflowError

//log all method arguments   
com.google.gson.Gson gson = new com.google.gson.Gson();
String json = gson.toJson(bindingResultArgFromControllerMethod);

框架代碼使用Gson將方法參數轉換為JSON以進行日志記錄。

有沒有辦法避免/處理這個異常?
更新結束

相關堆棧跟蹤:

    Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler processing failed; nested exception is java.lang.StackOverflowError] with root cause

java.lang.StackOverflowError: null
//Repeatattive block start 
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378)
//Repeatattive block end 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:155)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:97)
at com.google.gson.Gson.getAdapter(Gson.java:407)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:136)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:49)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:106)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:105)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:161)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:97)
at com.google.gson.Gson.getAdapter(Gson.java:407)

根據BindingResult的API文檔,這只是用戶輸入瀏覽器的數據的持有者 而且,BindingResult的實現可以包含對其他輔助對象的所有類型的引用。 基於堆棧跟蹤,有一個關於BindingResult當前實現的循環引用。

我想你想要對用戶輸入的數據進行jsonify。 然后,所有你需要做的是jsonify的target的的BindingResult

com.google.gson.Gson gson = new com.google.gson.Gson();
String json = gson.toJson(bindingResultArgFromControllerMethod.getTarget());

根據方法docs ,這個target是: 包裝的目標對象,可以是bean,具有公共字段的對象,Map - 取決於具體的綁定策略

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM