«Неожиданный конец ввода JSON» на контроллере Void SpringMVC Ajax - PullRequest
1 голос
/ 15 мая 2019

У меня есть приложения SpringMVC / Thymeleaf, где следующая обработка Ajax работает отлично, если я возвращаю boolean.Однако, как только метод void, я получаю ошибку Unexpected end of JSON input в Firebug.Это запрос POST.

@ResponseBody
@PostMapping("/addOrUpdate")
public void /*boolean works!*/ addOrUpdate(@RequestBody String json) throws Exception {
    service.addOrUpdateUserRoles(json);
    /*boolean works - return true;*/
}

JS

 $.ajax({
        type : "post",
        dataType : 'json',
        contentType : 'text/plain', 
        url : 'addOrUpdate',  
        data : id 
 })
 .then(function() {
     //...
 })
 .fail(function(jqXHR, textStatus, errorThrown) {
     //...
 });

Если я просто удалю @ResponseBody из определения метода, Thymeleaf жалуется, org.thymeleaf.exceptions.TemplateInputException: Error resolving template [addOrUpdate], template might not exist or might not be accessible by any of the configured Template Resolvers

Iпоследовал ResponseEntity пример здесь , но это не помогло - та же ошибка, JS переходит в раздел «Ошибка» с неожиданным концом ввода.

@ResponseBody
@PostMapping("/addOrUpdate")
public ResponseEntity addOrUpdate(@RequestBody String json) throws Exception {
    service.addOrUpdate(json);
    return new ResponseEntity(HttpStatus.OK);
}       

Ответы [ 3 ]

2 голосов
/ 15 мая 2019

С dataType : 'json' вы сообщаете jQuery, что ожидаете JSON в качестве ответа.Пустой ответ не является допустимым JSON, и сообщение об ошибке Unexpected end of JSON input говорит вам именно об этом.

Если вы не хотите ничего возвращать из метода контроллера addOrUpdate, удалите аннотацию @ResponseBody, так какнет тела ответа, и придерживайтесь ResponseEntity, но вместо этого используйте HttpStatus.NO_CONTENT, чтобы сообщить клиентам в вашем ответе, что не ожидается никакого контента.Кроме того, измените свой dataType на что-то, что может быть пустым, например 'text'.

0 голосов
/ 15 мая 2019

ЗАКЛЮЧИТЕЛЬНОЕ РЕШЕНИЕ на основе ответа digitalbreed

Контроллер

@PostMapping("/addOrUpdate")
public ResponseEntity<String> addOrUpdate(@RequestBody String json) throws Exception {
    try {
        service.addOrUpdate(json);
        return new ResponseEntity<String>(HttpStatus.OK); // No exceptions
    }
    catch (Exception e) {
        log.error("Error", e);
        return new ResponseEntity<String>(HttpStatus.BAD_REQUEST); // This will enable JS to catch the Exception from Ajax
    }
}   

JS

 $.ajax({
        type : "post",
        dataType : 'text', // Returns a ResponseEntity, not JSON (Void method)
        contentType : 'text/plain', 
        url : 'addOrUpdate',  
        data : somedata
 })
 .then(function() {
      //...
 })
 .fail(function(jqXHR, textStatus, errorThrown) {
      //... - will come here for a ResponseEntity of 'Bad Request'
 });
0 голосов
/ 15 мая 2019

Как говорит исключение, точка сбоя является вводом.
Вам необходимо отправить json формат ввода.

$.ajax({
        type : "post",
        dataType : 'json',
        contentType : 'text/plain', 
        url : 'addOrUpdate',  
        data : {id: id}
... 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...