【问题标题】:spring hibernate did not get the value of parameterspring hibernate 没有得到参数的值
【发布时间】:2019-09-07 22:45:28
【问题描述】:

我尝试通过邮递员使用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'

这是在 userServiceImpl 中: 下面的行 (BeanUtils) 是指here

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

但是,如果我使用下面的代码,setRole 方法是 not applicable,因为我在 DTO 中将 user.getRole() 定义为 int,但在 User 实体中将 newUser.setRole() 定义为 Role。但是,如果我将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 的输入参数设置为上面提供的integer

【问题讨论】:

    标签: java spring-boot crud


    【解决方案1】:

    由于您的请求中的角色收到 1,因此您应该执行以下操作:

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

    在代码的第一部分,问题可能出在BeanUtils.copyProperties(user, newUser, "password");,如果您尝试在该行之后调试或打印newUser,您将看到BeanUtils 无法正确填充@987654324 的所有字段@ 目的。这是因为在目标 (newUser) 中,字段 role 的类型为 Role,而在源 (user) 中,该字段的类型只是 int。

    【讨论】:

    • 好吧,当我尝试打印 newUser.getRole() 时,它会打印 null。那么,也许,我想问问你的意见,最好的做法(最常用的)是什么?目标是:我只想将用户角色的 id 存储在 user 表中的 role_id 列中。
    • @Akza 如果您不关心角色名称,只需从任何地方删除它,如果您关心它,您应该从某个地方获取它。你试过我上面的 sn-p 了吗?
    • 嗯,它有效。我想我只需要使用这个。非常感谢,先生!
    猜你喜欢
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多