весеннее CRUD DELETE действие, которое возвращает viewmodel или пустое тело - PullRequest
0 голосов
/ 12 января 2020

Я хочу написать действие DELETE, которое возвращает тело без содержимого, если ошибки id не существует. Если идентификатор не существует, я хочу перенаправить его в GET-представление.

Код контроллера:

@RequestMapping(value = "/todo/delete/{id}", method = RequestMethod.GET)
public String getDeleteTodo(Model model, @PathVariable("id") String id)
{
    Optional<Todo> todo = todoRepository.findById(Long.decode(id));

    if (todo.isEmpty()) {
        model.addAttribute("msginfo", "ctl-todo.delete.msginfo.id-not-exist");
        model.addAttribute("requestedId", id);
    }
    else {
        model.addAttribute("todo", todo.get());
    }

    return "v-todo-delete";
}

@RequestMapping(value = "/todo/delete/{id}", method = RequestMethod.DELETE)
public String deleteTodo(@PathVariable String id, RedirectAttributes redirAttrs)
{
    boolean exists = todoRepository.existsById(Long.decode(id));

    if (exists) {
        todoRepository.deleteById(Long.decode(id));
        return ""; //here I want to return a no-content body response
    }
    else {
        redirAttrs.addFlashAttribute("msginfo", "ctl-todo.delete.msginfo.id-not-exist");
        redirAttrs.addFlashAttribute("requestedId", id);

        return "redirect:/todo/delete" + id;
    }
}

Дополнительные сведения о представлении:

Представление GET является представлением juste, которое отображает сущность todo, соответствующую идентификатору. Удаление производится кнопкой с помощью ajax для вызова метода DELETE. Затем ответ возвращается как 204 без содержимого в теле, я перенаправляю пользователя с javascript на главную страницу ... Если идентификатор не существует в методе DELETE, я хочу перенаправить в метод GET, чтобы показать ошибку сообщение.

Если у кого-то есть идея сделать это. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 12 января 2020

Попробуйте использовать тип возвращаемого значения как ResponseEntity с любым телом ответа вместе со статусом ответа. Пожалуйста, обратитесь к изменениям кода ниже:

@RequestMapping(value = "/todo/delete/{id}", method = RequestMethod.DELETE)
public ResponseEntity deleteTodo(@PathVariable String id, RedirectAttributes redirAttrs)
{
   boolean exists = todoRepository.existsById(Long.decode(id));

   if (exists) {
       todoRepository.deleteById(Long.decode(id));
       return new ResponseEntity(HttpStatus.NO_CONTENT); //This will return No Content status
   }
   else {
       redirAttrs.addFlashAttribute("msginfo", "ctl-todo.delete.msginfo.id-not-exist");
       redirAttrs.addFlashAttribute("requestedId", id);

       return new ResponseEntity( "redirect:/todo/delete" + id, HttpStatus.OK);
   }
}
0 голосов
/ 12 января 2020

Последний ответ для меня:

@RequestMapping(value = "/todo/delete/{id}", method = RequestMethod.DELETE)
public ResponseEntity<?> deleteTodo(@PathVariable String id, RedirectAttributes redirAttrs)
{
   boolean exists = todoRepository.existsById(Long.decode(id));

   if (exists) {
       todoRepository.deleteById(Long.decode(id));
       return new ResponseEntity<>(HttpStatus.NO_CONTENT);
   }
   else {
       redirAttrs.addFlashAttribute("msginfo", "ctl-todo.delete.msginfo.id-not-exist");
       redirAttrs.addFlashAttribute("requestedId", id);
       /* I use CONFLICT here to explain that the entity was possibly deleted
          by another user between the moment the user give the view containing
          the DELETE ajax link and the moment he click on it. */
       return new ResponseEntity<String>( "redirect:/todo/delete" + id, HttpStatus.CONFLICT);
   }
}

Спасибо, Мандар Дхаруркар и Джит sh Котян за вашу помощь;)

...