【问题标题】:Spring boot post api - org.postgresql.util.PSQLException: ERROR: null value in column "password" violates not-null constraintSpring Boot post api-org.postgresql.util.PSQLException:错误:“密码”列中的空值违反非空约束
【发布时间】:2020-11-11 12:46:16
【问题描述】:

我创建了一个 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 作为数据库。

即使我给出数据值,我也会得到这个错误。我在互联网上搜索,但我找不到这个问题的解决方案

这是我使用的代码:

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);
}

用户控制器

@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));
    }
}

希望有人能帮我解决这个问题

【问题讨论】:

  • 能否调试并检查 this.usersMapper.toModel(usersDto) 是否真的返回了正确的用户对象?
  • UsersDto toDto(Users users); 工作吗?
  • @JeannotMn 我已经调试了 this.usersMapper.toModel(usersDto),它不返回用户对象。我看到用户名和密码都是空的
  • 你对 usersDto 有价值吗?
  • @JeannotMn 我从 usersdto 得到的值是:Users(user_id= 0, username=null, password= null)

标签: java spring postgresql spring-boot


【解决方案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 以及验证约束。

【讨论】:

  • 在您的控制器中设置断点,并检查您在调试模式下收到的内容。可能密码为空,所以你需要找出原因。
  • 我调试了控制器和映射器,如果我将 usersDto 发送到 this.usersMapper.toModel(usersDto),它将返回 null 值
  • 所以@Mapper 的某些东西不起作用 - 我对 MapStruct 不太熟悉,无法理解这个问题。
  • 我找到了替代解决方案。我不是通过 Mapper 来做,而是通过 ModelMapper 来做
猜你喜欢
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 2012-11-02
  • 2020-03-17
  • 1970-01-01
相关资源
最近更新 更多