#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