Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida sobre uso de PATCH vs PUT e Spring Security retornando Method Not Allowed

Estou implementando a camada de usuários em uma API REST com Spring Boot + Spring Security, seguindo boas práticas de arquitetura e REST.

Tenho um endpoint para atualização parcial do perfil do usuário, onde apenas alguns campos podem ser alterados (ex: nome e email) ou qualquer outro dado que o usuário deseja alterar:

PATCH /user/{id}

O controller está assim:

@PatchMapping("/{id}")
public UserProfileResponseDTO updateProfileUser(
@PathVariable UUID id,
@RequestBody @Valid UserUpdateProfileDTO dto
) {
return service.updateProfile(id, dto);
}

Porém, ao chamar esse endpoint, recebo:

HttpRequestMethodNotSupportedException: Request method 'PATCH' is not supported

Suspeito que o problema esteja na configuração do Spring Security, possivelmente bloqueando o método HTTP PATCH.

Minhas dúvidas são:

O uso de PATCH está correto para atualização parcial de um recurso (ex: atualizar apenas nome e email do usuário)?

Esse erro de Method Not Allowed pode ser causado pelo Spring Security não liberar o método PATCH explicitamente?

Seria correto trocar para PUT mesmo enviando apenas campos parciais, ou isso violaria a semântica REST?

Qual é a forma recomendada de liberar PATCH corretamente no Spring Security?

Contexto importante:

Estou evitando sobrescrever o recurso inteiro (por isso não quero PUT)

O update é feito carregando a entidade do banco e alterando apenas os campos enviados

O foco é seguir boas práticas REST e decisões arquiteturais corretas, não apenas “fazer funcionar”

Agradeço se puderem confirmar a abordagem correta e o ajuste recomendado no Spring Security.

2 respostas
solução!

Olá Kaua! Tudo bem?

Vamos por partes esclarecer suas dúvidas:

  1. Uso de PATCH: Você está correto em usar o PATCH para atualizações parciais de um recurso. O método PATCH é exatamente para isso, enquanto o PUT é geralmente utilizado para substituir o recurso inteiro. Portanto, a escolha de PATCH faz sentido para o seu caso de uso, onde apenas alguns campos do perfil do usuário estão sendo atualizados.

  2. Erro de Method Not Allowed: Esse erro pode sim estar relacionado ao Spring Security, que por padrão pode não permitir o método PATCH. Para resolver isso, você precisa ajustar as configurações de segurança para permitir o método PATCH. Isso pode ser feito na configuração do Spring Security, algo como:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers(HttpMethod.PATCH, "/user/**").authenticated()
            .and()
            .csrf().disable();
    }
    

    Certifique-se de ajustar as permissões conforme necessário para sua aplicação.

  3. Liberar PATCH no Spring Security: Como mencionado, você deve configurar o HttpSecurity para permitir o método PATCH. Além disso, verifique se não há outras configurações ou filtros que possam estar bloqueando o método PATCH.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Tive que adaptar algumas coisas para o projeto, agraçedo pela ajuda. Deu certo agora.
O problema estava na configuração do Spring Security e no uso do PATCH.
Ajustei a dependência, a configuração de segurança e adaptei o DTO/service para atualização parcial, e o endpoint passou a funcionar corretamente.

Agradeço pela ajuda!