Spring Hibernate没有获取到参数值

3

我试着通过Postman使用post方法来对我的Spring Boot应用程序进行API调用。 以下是输入:

{
  "username": "name",
  "password": "1234",
  "age": 12,
  "salary": 5000,
  "role": 1
}

以下是控制器中的代码:

@RequestMapping(value = "/signup", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> saveUser(@RequestBody UserDto user) {
        try {
            System.out.println(user.getUsername()); // => name
            System.out.println(user.getPassword()); // => 1234
            System.out.println(user.getSalary()); // => 5000
            System.out.println(user.getRole()); // => 1
            System.out.println(user.getAge()); // => 12
            userService.save(user);
            return ResponseEntity.ok().body("insert done");
        } catch (Exception e) {
            return ResponseEntity.badRequest().body(e.getMessage());
        }
    }

这是我的User.java文件。

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String username;
@Column
@JsonIgnore
private String password;
@Column
private long salary;
@Column
private int age;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "role_id")
private Role role;
// getters and setters

以下是我的Role.java代码:

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "role_name", nullable = false)
private String roleName;
// getters and setters

这是我的UserDto.java文件。
private String username;
private String password;
private int age;
private long salary;
private int role;
// getters and setters

这是我的RoleDto.java文件。
private Long id;
private String roleName;
// getters and setters

问题:出现错误'Column 'role_id' cannot be null'

这里是在userService实现中: 下面这行代码(BeanUtils)参考自这里

    @Override
    public User save(UserDto user) throws Exception {
        User newUser = new User();
        BeanUtils.copyProperties(user, newUser, "password");
        newUser.setPassword(bcryptEncoder.encode(user.getPassword()));
        try {
            userDao.save(newUser);
        } catch (Exception e) {
            throw new Exception(e);
            // this throw "Column role_id cannot be null"
        }
        return newUser;
    }

但是,如果我使用下面的代码,由于我在DTO中将user.getRole()定义为 int,但是在User实体中将newUser.setRole()定义为 Role,因此setRole方法是不适用的。但是,如果我将User实体中的setRole更改为int,那么我该如何告诉spring关于UserRole之间的ManyToOne关系呢?

@Override
public User save(UserDto user) throws Exception {
    User newUser = new User();
    newUser.setUsername(user.getUsername());
    newUser.setPassword(bcryptEncoder.encode(user.getPassword()));
    newUser.setAge(user.getAge());
    newUser.setSalary(user.getSalary());
    newUser.setRole(user.getRole()); // here is the problem
    try {
        userDao.save(newUser);
    } catch (Exception e) {
        throw new Exception(e);
    }
    return newUser;
}

注意:我认为我只需要将role的输入参数作为提供的整数即可。
1个回答

2

如果您在请求中收到了1个角色,应该执行以下操作:

最初的回答是:

Role role = new Role();
role.setId(user.getRole());
role.setRoleName("some name");
newUser.setRole(role);

在代码的第一部分,问题可能出在这里:BeanUtils.copyProperties(user, newUser, "password");,如果你尝试调试或打印newUser,你会发现BeanUtils无法正确地填充newUser对象的所有字段。这是因为在目标(newUser)中,字段role的类型是Role,而在源(user)中该字段的类型只是int。最初的回答。

当我尝试打印newUser.getRole()时,它会打印null。那么,也许,我想请问您的意见,最佳实践(最常用)是什么?目标是:我只想在用户表中的role_id列中存储用户角色的id。 - Akza
@Akza 如果你不在意角色名称,就从所有地方将其删除;如果你在意,你应该从某个地方获取它。你试过我上面的片段吗? - burm87
1
好的,它能正常工作。我想我只需要使用这个。非常感谢,先生! - Akza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接