Spring boot post api — org.postgresql.util.PSQLException: ОШИБКА: нулевое значение в столбце «пароль» нарушает ограничение not-null

#java #spring #postgresql #spring-boot

#java #весна #postgresql #spring-boot

Вопрос:

Я создал приложение spring boot. И в приложении я работаю с API. У меня есть POST API для создания пользователя, но каждый раз, когда я использую api, я получаю следующую ошибку

 Spring boot post api - org.postgresql.util.PSQLException: ERROR: null value in column "password" violates not-null constraint
  

Я использую hibernate и PostgreSQL в качестве базы данных.

Даже если я дам значения данных de, я получу эту ошибку. Я искал в Интернете, но не могу найти решение этой проблемы

Это код, который я использую:

Users.java:

 @Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Builder(toBuilder = true)
@ToString
@Table
public class Users {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int user_id;
    @Column(unique = true, nullable = false)
    private String username;
    @Column(nullable = false)
    private String password;
}
  

UsersRepository.java

 @Repository
public interface UsersRepository extends JpaRepository<Users, Integer> {}
  

Служба пользователей

 @Service
@RequiredArgsConstructor
@Transactional
public class UsersService {
    private final UsersRepository usersRepository;

    public Users createUser(Users newUsers) {
        return this.usersRepository.save(newUsers);
    }
}
  

UsersDto

 @Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class UsersDto {
    private int user_id;
    private String username;
    private String password;
}
  

Пользовательская карта

 @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UsersMapper {
    UsersDto toDto(Users users);
    Users toModel(UsersDto usersDto);
}
  

UsersController

 @RestController
@CrossOrigin(origins = "http://localhost:4200")
@RequiredArgsConstructor
@RequestMapping("/users")
@Validated
public class UsersController {
    private final UsersService usersService;
    private final UsersMapper usersMapper;

    @PostMapping()
    @ApiOperation(value = "Create new user", httpMethod = "POST", code = 201)
    @ResponseBody
    public ResponseEntity<UsersDto> createUser(@RequestBody UsersDto usersDto) throws Exception {
        Users users = this.usersMapper.toModel(usersDto);
        Users createUsers = this.usersService.createUser(users);
        return ResponseEntity.ok(this.usersMapper.toDto(createUsers));
    }
}
  

Я надеюсь, что кто-нибудь может помочь мне с этой проблемой

Комментарии:

1. можете ли вы отладить и проверить, действительно ли this.usersMapper.toModel(usersDto) возвращает правильный объект users?

2. UsersDto toDto(Users users); Работает ли?

3. @JeannotMn я отладил this.usersMapper.toModel(usersDto), и он не возвращает объект users . Я вижу, что имя пользователя и пароль равны нулю

4. У вас есть значение для usersDto?

5. @JeannotMn значение, которое я получаю от usersdto, таково: Users(user_id= 0, username= null, password = null)

Ответ №1:

В ошибке указано, что пароль равен нулю, что недопустимо. Так что, вероятно, это не указано в запросе, отправленном вашему API. Вы можете добавить ограничения проверки к конечной точке, например

     @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    public class UsersDto {
        private int user_id;
        @NotNull
        private String username;
        @NotNull
        private String password;
    }
  

Еще одно замечание: хранить пароль в виде обычного текста не рекомендуется, это серьезная проблема безопасности. Вместо этого вы должны создать и использовать хэш, для этого проверьте Spring Security.

PS — проверить bootify.io — здесь вы можете создать свой REST API вместе с ограничениями проверки.

Комментарии:

1. Установите точку останова в вашем контроллере и проверьте, что вы получаете в режиме отладки. Вероятно, пароль равен null, поэтому вам нужно выяснить, почему.

2. Я отладил контроллер и преобразователь, если я отправлю usersDto в this.usersMapper.toModel(usersDto), он отправит обратно значения с null

3. Итак, что-то с @Mapper не работает — я не настолько знаком с MapStruct, чтобы понять проблему.

4. Я нашел альтернативное решение. Вместо того, чтобы делать это через Mapper, я делаю это через ModelMapper