环境:
弹簧靴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)
最佳答案
根据BindingResult的API文档,这仅是用户输入到浏览器的数据的所有者。而且,BindingResult的实现可以包含对其他帮助程序对象的各种引用。基于堆栈跟踪,有一个关于BindingResult
当前实现的循环引用。
我认为您想对用户输入的数据进行json处理。然后,您需要做的是对target
的BindingResult
进行json化:
com.google.gson.Gson gson = new com.google.gson.Gson();
String json = gson.toJson(bindingResultArgFromControllerMethod.getTarget());
根据method docs,此
target
是:包装的目标对象,可以是Bean,具有公共字段的对象,是Map-取决于具体的绑定策略。希望这可以帮助。
关于java - 使用Gson将BindingResult转换为JSON时出现java.lang.StackOverflowError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39221488/