java - DELETE 和 PUT 方法总是调用 POST

标签 java spring spring-boot hibernate jpa

我遇到了一个问题,但我不知道如何去思考它。

我有一个窗口,显示从 BD 加载的表中的 Activity 类型列表。我为每一行设置了几个操作按钮,包括删除和编辑。在我看来,问题是当我给出两个按钮中的任何一个时,它们总是调用 POST 方法。我有 PUT 和 DELETE,但它们不会经过那里,并且总是转到 POST。

我放置了 Controller 和 html 代码来查看是否有人看到了被忽略的内容。

Tipo_Actividad_ServicioController 类:

@Controller
public class Tipo_Actividad_ServicioController {

    @Autowired
    private Tipo_Actividad_ServicioService tipo_Actividad_ServicioServcie;

    @RequestMapping(value = "/tipo_actividad_servicio", method = RequestMethod.GET) 
    public String findAll(Model model) {

        extracted(model);

        return "tipo_actividad_servicio";

    }

    // Guardar Tipo_Actividad_Servicio
    @RequestMapping(value = "/tipo_actividad_servicio", method = RequestMethod.POST) 
    public String save(Tipo_Actividad_Servicio tipo_Actividad_Servicio, Model model) {

        tipo_Actividad_ServicioServcie.save(tipo_Actividad_Servicio);

        extracted(model);

        return "tipo_actividad_servicio";

    }

    @RequestMapping(value = "/tipo_actividad_servicio", method = RequestMethod.PUT) 
    public String saveById(@RequestParam int id, Model model) {

        Tipo_Actividad_Servicio tipo_Actividad_Servicio = tipo_Actividad_ServicioServcie.findById(id);

        if(tipo_Actividad_Servicio.isActivo())
            tipo_Actividad_Servicio.setActivo(false);
        else
            tipo_Actividad_Servicio.setActivo(true);

        tipo_Actividad_ServicioServcie.save(tipo_Actividad_Servicio);

        extracted(model);

        return "tipo_actividad_servicio";

    }

    @RequestMapping(value = "/tipo_actividad_servicio", method = RequestMethod.DELETE) 
    public String deleteById(@RequestParam int id, Model model) {

        tipo_Actividad_ServicioServcie.deleteById(id);

        extracted(model);

        return "tipo_actividad_servicio";

    }

    private void extracted(Model model) {

        model.addAttribute("tipos_actividad_servicio", tipo_Actividad_ServicioServcie.findAll());
        model.addAttribute("tipo_actividad_servicio", new Tipo_Actividad_Servicio());

    }

}

以及调用删除方法的 HTML 表格。

<tbody>
<tr th:each="familia,iterStat : ${tipos_actividad_servicio}" th:class="${iterStat.odd}? 'odd'">
  <td th:text="${familia.id}" style="display:false"></td>
  <td th:text="${familia.nombre}"></td>
  <td th:text="${familia.tipo}"></td>
  <td th:text="${familia.observaciones}"></td>
  <td style="display: flex; justify-items: center; align-items: center;">
    <div class="btn-group">
      <button type="button" class="text-white btn .btn-sm btn-warning" data-toggle="modal" data-target="#modal-lg">
          Editar
      </button>
      <form style="margin: 0px;" th:action="@{/tipo_actividad_servicio}" th:method="put">
        <input type="hidden" name="id" th:value="${familia.id}">
        <button class="text-white btn .btn-sm btn-success" th:unless="${familia.activo}" type="submit">
            Activar
        </button>
        <button class="text-white btn .btn-sm btn-secondary" th:if="${familia.activo}" type="submit">
            Desactivar
        </button>
      </form>
      <form style="margin: 0px;" th:action="@{/tipo_actividad_servicio}" th:method="delete">
        <input type="hidden" name="id" th:value="${familia.id}">
        <button class="text-white btn .btn-sm btn-danger" th:if="${familia.activo}" type="submit">
            Eliminar
        </button>
      </form>
    </div>
  </td>
</tr>
</tbody>

这是控制台在调用该方法时向我显示的内容:

Hibernate: update tipo_actividad_servicio set activo=?, nombre=?, observaciones=?, tipo=? where id=?

当我从 Firefox 检查表单时,它告诉我该方法是 post 并且它将调用 PUT 或 DELETE ...

<form style="margin: 0px;" action="/tipo_actividad_servicio" method="post">
  <input type="hidden" name="_method" value="put">
  <input type="hidden" name="id" value="2">
  <button class="text-white btn .btn-sm btn-secondary" type="submit">
    Desactivar
  </button>
</form>

事实是,我不再确切地知道该做什么、该尝试什么,如果有人能告诉我为什么它不能消除......

谢谢。

最佳答案

如果您使用的是 Boot 2.3.X,请确保您已启用隐藏的 http 方法过滤器 spring.mvc.hiddenmethod.filter.enabled=true。从 2.3.X 开始,此过滤器不再自动启用。该过滤器将查看 _method 属性并将请求定向到适当的 Controller 方法。

关于java - DELETE 和 PUT 方法总是调用 POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62374626/

相关文章:

java - 如何在javafx中动态添加节点到 Pane

java - 我如何使用一个根上下文创建两个 AbstractAnnotationConfigDispatcherServletInitializer?

java - JPA 检查查询是否为空

spring-boot - 如何使用 Spring Security 在 Spring Boot 中设置上下文路径

spring-boot - 在具有单独的 IdP 服务器的 spring boot 应用程序中使用 redis

java - 从spring config调用静态方法并传递参数

java - 如何在 ant 文件调用批处理文件时构建失败,该批处理文件调用 ant 文件

java - 使 Canvas 的画线可点击

java - Spring Web Service REST API JSON 响应始终包含 boolean 值

java - 为什么 spring 不使用我的构造函数来初始化这个 bean(Map 参数)