es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

DTO de primavera creado por modelmapper devuelve todo como nulo.

Cuando cambié el valor de retorno de “User” a “Optional“, mi UserResponseDTO devuelve null, funciona correctamente cuando cambio “Optional” a “User”, ¿cómo puedo arreglarlo? La base de datos guarda todos los valores que ingreso en Postman.

Método save del dao de USER:

public Optional<user> saveUser(User user) {
    jdbcTemplate.update("INSERT INTO usr (username, password, email, country, gender) VALUES (?, ?, ?, ?, ?)", user.getUsername(), user.getPassword(), user.getEmail(), user.getCountry(), user.getGender().getId());
    return Optional.ofNullable(user);
}

Método save del servicio de USER:

public Optional<user> save(User user) {
    if (validate(user.getEmail())) {
        user.setPassword(passwordEncoder.encode(user.getPassword()));
        user.setRole(Role.USER);
        user.setStatus(Status.ACTIVE);
        Optional<user> userSaved = userDao.saveUser(user);
        return userSaved;
    }
    log.warn("Has ingresado un correo electrónico incorrecto");
    return Optional.ofNullable(user);
}

Método save del controlador de usuario:

@PostMapping(value = "")
public ResponseEntity<userresponse> saveUser(@RequestBody UserRequest userRequest) {
    User userUntilSave = modelMapper.map(userRequest, User.class);
    Optional<user> user = userService.save(userUntilSave);
    UserResponse userResponse = modelMapper.map(user, UserResponse.class);
    return new ResponseEntity<>(userResponse, HttpStatus.CREATED);
}

Captura de pantalla de Postman: enlace a la imagen

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema es que cuando cambias el tipo de retorno del método saveUser de User a Optional<user>, la variable userSaved en el método save de la capa de servicio se convierte en Optional<user>. Por lo tanto, cuando intentas asignarlo a UserResponse en la capa del controlador, devuelve null porque espera un objeto User.

    Para solucionar este problema, puedes modificar el código en la capa del controlador para usar el método orElseThrow para obtener el objeto User de Optional<user>. Aquí tienes una versión actualizada del método del controlador:

    @ApiOperation(value = "obtener los datos del usuario del cuerpo de la solicitud y guardarlos en la base de datos")
    @PostMapping(value = "")
    public ResponseEntity<userresponse> saveUser(@RequestBody UserRequest userRequest) {
        User userUntilSave = modelMapper.map(userRequest, User.class);
        Optional<user> user = userService.save(userUntilSave);
        UserResponse userResponse = user.map(u -> modelMapper.map(u, UserResponse.class)).orElseThrow(() -> new RuntimeException("El objeto User es nulo."));
        return new ResponseEntity<>(userResponse, HttpStatus.CREATED);
    }
    

    Al usar orElseThrow, puedes proporcionar un mensaje de excepción cuando Optional<user> esté vacío.

Comments are closed.