首页 > 解决方案 > 如何从 Json 接收数组到 Set在 Java 中?

问题描述

基本上我的 json 帖子是这样的:

  {username: "2kzhuanyonghao2", password: "qqq542417349", confirmPassword: "qqq542417349", firstname: "peiran", lastname: "liu", …}
confirmPassword: "qqq542417349"
email: "liupeiran9324@gmail.cokm"
firstname: "peiran"
lastname: "liu"
password: "qqq542417349"
phone: "234324234322"
roles: Array(2)
0: "Manager"
1: "Admin"
length: 2
__proto__: Array(0)
username: "2kzhuanyonghao2"
__proto__: Object

好吧,如您所见,角色是一个包含“Manager”和“Admin”的 Array(2)

现在我希望我的 Java spring 后端可以把这个角色变成一组字符串,然后我有一个

注册请求类:

package com.crmbackend.payLoad.request;

import java.util.Set;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

public class SignupRequest {

    @NotBlank
    @Size(min = 1, max = 128)
    private String username;

    @NotBlank
    @Size(min = 5, max = 128)
    private String password;

    @NotBlank
    @Size(max = 128)
    @Email
    private String email;

    @NotBlank
    @Size(max = 45)
    private String firstname;

    @NotBlank
    @Size(max = 45)
    private String lastname;

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @NotBlank
    @Size(max = 64)
    private String phone;

    private Set<String> roles;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Set<String> getRoles() {
        return roles;
    }

    public void setRoles(Set<String> roles) {
        this.roles = roles;
    }

}

当我使用这个类时,我正在这样做:

Set<String> roleSetString = signUpRequest.getRoles();

每个属性都很好,除了这个角色属性,我一直为此获取 Null 值。

Here is my controller where call the signUpRequest:


@PostMapping("/signup")
    public ResponseEntity<?> regietserUser(@Valid @RequestBody SignupRequest signUpRequest) {
        if (userRepo.existsByUsername(signUpRequest.getUsername())) {
            return ResponseEntity.badRequest().body(new ReturnMessageResponse("Error: Username is already exist!"));

        }

        if (userRepo.existsByEmail(signUpRequest.getEmail())) {
            return ResponseEntity.badRequest().body(new ReturnMessageResponse("Error: Email is already used"));
        }

        User user = new User(signUpRequest.getUsername(), signUpRequest.getFirstname(), signUpRequest.getLastname(),
                encoder.encode(signUpRequest.getPassword()), signUpRequest.getEmail(), signUpRequest.getPhone());

        Set<String> roleSetString = signUpRequest.getRoles();
        Set<Role> roles = new HashSet<>();
//if there are no roll specific

        System.out.println(roleSetString);
        if (roleSetString == null) {
            Role userRole = roleRepo.findByName("User")
                    .orElseThrow(() -> new RuntimeException("Error: Role user is missing/not found"));
            roles.add(userRole);
        } else {
            roleSetString.forEach(role -> {
                switch (role) {

                case "Admin":
                    Role adminRole = roleRepo.findByName("Admin")
                            .orElseThrow(() -> new RuntimeException("Error: Role Admin is not found."));
                    roles.add(adminRole);
                    break;

                case "Manager":
                    Role managerRole = roleRepo.findByName("Manager")
                            .orElseThrow(() -> new RuntimeException("Error: Role Manager is not found."));
                    roles.add(managerRole);

                    break;

                case "User":
                    Role userRole = roleRepo.findByName("User")
                            .orElseThrow(() -> new RuntimeException("Error: Role User is not found."));
                    roles.add(userRole);

                    break;

                }
            });
        }
        user.setRoles(roles);
        userRepo.save(user);

        return ResponseEntity.ok(new ReturnMessageResponse("User registered successfully!!"));

    }

但是当我打印出 roleSetString 时,它仍然返回 null,这意味着 getRoles() 无法返回我通过 json 数组传递的角色值。有什么建议吗?

标签: javajsonspringspring-boot

解决方案


您如何/在哪里将每个 JSON 字段映射到类字段?问题可能就在那里。此外,您的班级中的角色字段似乎没有任何注释(与其他字段不同),这会影响它吗?


推荐阅读