java.lang.StackruError при преобразовании BindingResult в JSON с использованием Gson

Среда:
Пружинный ботинок - 1.2.3
Выпуск:

когда BindingResult добавляется в качестве следующего аргумента @Valid аргумент для метода контроллера, как показано ниже, продолжайте получать java.lang.StackruError

@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 Аргумент метода удален, он работает нормально.
Обновление начала
Нашел проблему, StackruError произошло при конвертации 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.StackruError] with root cause

java.lang.StackruError: 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 ответ

Решение

Согласно документам API BindingResult, это только держатель данных, введенных пользователем в браузер. Более того, реализация BindingResult может содержать все виды ссылок на другие вспомогательные объекты. На основе трассировки стека есть круговая ссылка на текущую реализацию BindingResult,

Я думаю, что вы хотите jsonify данные, введенные пользователем. Тогда все, что вам нужно сделать, это jsonify target из BindingResult:

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

это target в соответствии с методом docs: обернутый целевой объект, которым может быть бин, объект с открытыми полями, карта - в зависимости от конкретной стратегии связывания.

Надеюсь это поможет.

Другие вопросы по тегам