使用Gson将BindingResult转换为JSON时的java.lang.StackOverflowError

时间:2016-08-30 07:36:10

标签: java spring spring-boot gson spring-validator

环境:
  弹簧靴 - 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方法参数,它可以正常工作 更新开始
使用以下代码将StackOverflowError实例转换为BindingResult时发现问题JSON

//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)

1 个答案:

答案 0 :(得分:0)

根据BindingResult的API文档,这只是用户输入浏览器的数据的 持有者 。而且,BindingResult的实现可以包含对其他辅助对象的所有类型的引用。根据堆栈跟踪,有关BindingResult当前实现的循环引用。

我认为您想要对用户输入的数据进行jsonify。然后,您需要做的就是jsonify target的{​​{1}}:

BindingResult

这个com.google.gson.Gson gson = new com.google.gson.Gson(); String json = gson.toJson(bindingResultArgFromControllerMethod.getTarget()); 是根据method docs包装的目标对象,可以是bean,具有公共字段的对象,Map - 取决于具体的绑定策略< / em>的

希望这有帮助。