Spring Boot用户注册接口BindException问题求助
Spring Boot 用户注册接口字段绑定异常问题
在Spring Boot REST API中实现用户控制器时遇到以下问题:已配置接收JSON请求,但提交请求后返回BindException(曾误判为403),提示请求体中的nome、login、senha、email、endereco字段为null,但确认已传入对应值。以下是错误信息、相关代码及数据库表结构,寻求排查方案以完成用户注册功能。
错误信息
Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 5 errors Field error in object 'dadosCadastroUsuario' on field 'senha': rejected value [null]; codes [NotBlank.dadosCadastroUsuario.senha,NotBlank.senha,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [dadosCadastroUsuario.senha,senha]; arguments []; default message [senha]]; default message [não deve estar em branco] Field error in object 'dadosCadastroUsuario' on field 'endereco': rejected value [null]; codes [NotNull.dadosCadastroUsuario.endereco,NotNull.endereco,NotNull.br.com.farmacos.endereco.DadosEndereco,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [dadosCadastroUsuario.endereco,endereco]; arguments []; default message [endereco]]; default message [não deve ser nulo] Field error in object 'dadosCadastroUsuario' on field 'login': rejected value [null]; codes [NotBlank.dadosCadastroUsuario.login,NotBlank.login,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [dadosCadastroUsuario.login,login]; arguments []; default message [login]]; default message [não deve estar em branco] Field error in object 'dadosCadastroUsuario' on field 'email': rejected value [null]; codes [NotBlank.dadosCadastroUsuario.email,NotBlank.email,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [dadosCadastroUsuario.email,email]; arguments []; default message [email]]; default message [não deve estar em branco] Field error in object 'dadosCadastroUsuario' on field 'nome': rejected value [null]; codes [NotBlank.dadosCadastroUsuario.nome,NotBlank.nome,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [dadosCadastroUsuario.nome,nome]; arguments []; default message [nome]]; default message [não deve estar em branco]]
相关代码
用户控制器代码
@RestController @RequestMapping("usuarios") @Tag(name= "Usuários", description = "Endpoints para controle de usuários") public class UsuarioController { @Autowired private UsuarioRepository repository; @PostMapping @Transactional @Operation(summary = "Cadastre um usuário", description ="Cadastre um usuário", tags = {"Usuários"}, responses = { @io.swagger.v3.oas.annotations.responses.ApiResponse( responseCode = "200",content = @Content( mediaType = "application/json")), @io.swagger.v3.oas.annotations.responses.ApiResponse( responseCode = "400",content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse( responseCode = "401",content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse( responseCode = "404",content = @Content), @io.swagger.v3.oas.annotations.responses.ApiResponse( responseCode = "500",content = @Content), }) public ResponseEntity<DadosDetalhamentoUsuario> cadastrar(@RequestBody @Valid DadosCadastroUsuario dados, UriComponentsBuilder uriBuilder){ var usuario = new Usuario(dados); repository.save(usuario); var uri = uriBuilder.path("/usuarios/{id}").buildAndExpand(usuario.getId()).toUri(); return ResponseEntity.created(uri).body(new DadosDetalhamentoUsuario(usuario)); } }
安全配置代码
@Configuration @EnableWebSecurity public class SecurityConfigurations { @Autowired private SecurityFilter filtroDeSeguranca; @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { return http.csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and().authorizeHttpRequests() .requestMatchers(HttpMethod.POST, "/login").permitAll() .requestMatchers(HttpMethod.POST, "/usuarios").permitAll() .anyRequest().authenticated() .and().addFilterBefore(filtroDeSeguranca, UsernamePasswordAuthenticationFilter.class) .build(); } @Bean AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception { return configuration.getAuthenticationManager(); } @Bean PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean WebSecurityCustomizer webSecurityCustomizer() { return (web) -> web.ignoring().requestMatchers("/swagger-ui/**", "/v3/api-docs/**"); } }
注册请求DTO
public record DadosCadastroUsuario( @NotBlank String nome, @NotBlank String login, @NotBlank @Size(min=6, max=30) String senha, @NotBlank @Email String email, @CPF String cpf, @NotNull @Valid DadosEndereco endereco ) {}
用户详情响应DTO
public record DadosDetalhamentoUsuario(Long id, String nome, String login, String email, String cpf, Endereco endereco) { public DadosDetalhamentoUsuario(Usuario usuario) { this(usuario.getId(), usuario.getNome(), usuario.getLogin(), usuario.getEmail(), usuario.getCpf(), usuario.getEndereco()); } }
用户实体类
@Table(name = "usuarios") @Entity(name = "Usuario") @Getter @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(of ="id") public class Usuario implements UserDetails{ private static final long serialVersionUID = 1L; public Usuario (DadosCadastroUsuario dados) { this.nome = dados.nome(); this.login = dados.login(); this.senha = dados.senha(); this.email = dados.email(); this.cpf = dados.cpf(); this.ativo = true; this.endereco = new Endereco(dados.endereco()); } @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nome; private String login; private String senha; private String email; private String cpf; private boolean ativo; @Embedded private Endereco endereco; @Override public Collection<? extends GrantedAuthority> getAuthorities() { return List.of(new SimpleGrantedAuthority("ROLE_USER")); } @Override public String getPassword() { return senha; } @Override public String getUsername() { return login; } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; } }
数据库表结构
create table usuarios( id bigint not null auto_increment, login varchar (100) not null, senha varchar (255) not null, ativo tinyint, nome varchar (100) not null, email varchar (100) not null, cpf varchar (100) not null, cep varchar (100) not null, uf char (2) not null, cidade varchar (100) not null, bairro varchar (100) not null, complemento varchar (100), numero varchar (100), primary key (id) );
内容的提问来源于stack exchange,提问作者MATEUS DE SOUZA ALVES
相关产品推荐
相关产品推荐

