I have a problem when modifying a user, it sends me a url with an error and the user is not modified, if someone can help me to make it work correctly
I will leave the controller, service, userDTO, userMapper, my user_management and modify user
<form th:object="${modificarUsuario}" th:action="@{/modificar_usuario/{id_usuario}}" method="post">
<div class="inputs">
<div class="nombre ">
<label for="modificarNombre">Nombre</label>
<div class="form-input">
<input type="text" id="modificarNombre" th:field="*{nombre}" />
<!-- <div th:if="${#fields.hasErrors('nombre')}" th:errors="*{nombre}" class="text-danger"></div>-->
</div>
</div>
<div class="apellido-p">
<label for="modificarApellidoP">Apellido Paterno</label>
<div class="form-input">
<input type="text" id="modificarApellidoP" th:field="*{apellido_p}" />
<!-- <div th:if="${#fields.hasErrors('apellido_p')}" th:errors="*{apellido_p}" class="text-danger" ></div>-->
</div>
</div>
<div class="apellido-m">
<label for="modificarApellidoM">Apellido Materno</label>
<div class="form-input">
<input type="text" id="modificarApellidoM" th:field="*{apellido_m}" />
<!-- <div th:if="${#fields.hasErrors('apellido_m')}" th:errors="*{apellido_m}" class="text-danger" ></div>-->
</div>
</div>
<div class="correo">
<label for="modificarCorreo">Correo</label>
<div class="form-input">
<input type="email" id="modificarCorreo" th:field="*{correo}" />
<!-- <div th:if="${#fields.hasErrors('correo')}" th:errors="*{correo}" class="text-danger" ></div>-->
</div>
</div>
<div class="contraseña">
<label for="modificarPassword">Contraseña</label>
<div class="form-input">
<input type="password" id="modificarPassword" placeholder="********" readonly />
</div>
</div>
<div class="tipo-usuario">
<label for="modificarCargo">Tipo de Usuario</label>
<select id="modificarCargo" th:field="*{cargo}">
<option value="" disabled selected></option>
<option th:value="ROL_ESTUDIOS" th:selected="${#strings.equals(modificarUsuario.cargo, 'ROL_ESTUDIOS')}">Estudios</option>
<option th:value="ROL_ADMINISTRADOR" th:selected="${#strings.equals(modificarUsuario.cargo, 'ROL_ADMINISTRADOR')}">Administrador</option>
</select>
<i class="fa-solid fa-chevron-down"></i>
<!-- <div th:if="${#fields.hasErrors('cargo')}" th:errors="*{cargo}" class="text-danger" ></div>-->
</div>
</div>
<div class="boton-guardar">
<button type="submit">Guardar</button>
</div>
</form>
<td><a th:href="@{/modificar_usuario(id_usuario=${usuario.id_usuario})}"><i class="fa-solid fa-pen-to-square"></i> Modificar</a></td>
@Service
public class GestionUsuariosService {
@Autowired
private UsuarioRepository usuarioRepository;
@Autowired
private UsuarioMapper usuarioMapper;
@Autowired
private PasswordEncoder passwordEncoder;
public List<Usuario> listarUsuarios() {
return usuarioRepository.findAll();
}
public Usuario obtenerUsuarioPorId(Long id_usuario) {
return usuarioRepository.findById(id_usuario).orElse(null);
}
public Usuario modificarUsuario(Long id_usuario, UsuarioDTO usuarioDTO) {
Usuario usuarioExistente = usuarioRepository.findById(id_usuario).orElse(null);
if (usuarioExistente != null) {
Usuario usuarioActualizado = usuarioMapper.toEntity(usuarioDTO);
usuarioActualizado.setId_usuario(id_usuario);
return usuarioRepository.save(usuarioActualizado);
}
return null;
}
public class UsuarioDTO {
@NotEmpty(message = "El correo es obligatorio")
@Email(message = "Ingrese un correo electrónico válido")
private String correo;
@NotEmpty(message = "La contraseña es obligatorio")
@Size(min = 6, message = "La contraseña debe tener al menos 6 caracteres")
private String password;
@NotEmpty(message = "El nombre es obligatorio")
private String nombre;
@NotEmpty(message = "El apellido paterno es obligatorio")
private String apellido_p;
@NotEmpty(message = "El apellido materno es obligatorio")
private String apellido_m;
@NotNull(message = "El cargo es obligatoria")
private EnumRoles cargo;
GETTER / SETTERS
@Component
public class UsuarioMapper {
@Autowired
private RolRepository rolRepository;
public Usuario toEntity(UsuarioDTO dto) {
Usuario usuario = new Usuario();
usuario.setCorreo(dto.getCorreo());
usuario.setPassword(dto.getPassword());
Persona persona = new Persona();
persona.setNombre(dto.getNombre());
persona.setApellido_p(dto.getApellido_p());
persona.setApellido_m(dto.getApellido_m());
EnumRoles cargo = dto.getCargo();
Rol rol = rolRepository.findByCargo(cargo);
usuario.setPersona(persona);
usuario.setRol(rol);
return usuario;
}
public UsuarioDTO toDTO(Usuario usuario) {
UsuarioDTO usuarioDTO = new UsuarioDTO();
usuarioDTO.setCorreo(usuario.getCorreo());
usuarioDTO.setNombre(usuario.getPersona().getNombre());
usuarioDTO.setApellido_p(usuario.getPersona().getApellido_p());
usuarioDTO.setApellido_m(usuario.getPersona().getApellido_m());
usuarioDTO.setCargo(usuario.getRol().getCargo());
return usuarioDTO;
}
}
@GetMapping("/modificar_usuario")
public ModelAndView modificarFormulario(@RequestParam Long id_usuario) {
Usuario usuarioExistente = gestionUsuariosService.obtenerUsuarioPorId(id_usuario);
if (usuarioExistente != null) {
UsuarioDTO usuarioDTO = usuarioMapper.toDTO(usuarioExistente);
return new ModelAndView("modificar_usuario").addObject("modificarUsuario", usuarioDTO);
} else {
return new ModelAndView("redirect:/gestion_usuarios");
}
}
@PostMapping("/modificar_usuario")
public String modificarUsuario(@RequestParam Long id_usuario, @Valid @ModelAttribute("modificarUsuario") UsuarioDTO usuarioDTO, BindingResult bindingResult, RedirectAttributes redirectAttributes) {
if (bindingResult.hasErrors()) {
return "modificar_usuario";
}
Usuario usuarioActualizado = gestionUsuariosService.modificarUsuario(id_usuario, usuarioDTO);
if (usuarioActualizado != null) {
redirectAttributes.addAttribute("successMessage", "Usuario Actualizado");
} else {
redirectAttributes.addAttribute("errorMessage", "No se pudo actualizar el usuario");
}
return "redirect:/gestion_usuarios";
}
I hope help and answer about modifying