【问题标题】:How to receive a Array from a Json into Set<String> in Java?如何从 Json 接收数组到 Java 中的 Set<String>?
【发布时间】:2021-07-18 04:13:30
【问题描述】:

基本上我的 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

好吧,你可以看到角色是一个数组(2),其中包含“经理”和“管理员”

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

signUpRequest 类:

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数组传递的角色值. 有什么建议吗?

【问题讨论】:

  • 这不是有效的 JSON,请重试。
  • 什么无效?似乎他只是在没有逗号的情况下粘贴了里面,但在其他方面是有效的。即使通过了他的程序,也只有角色属性被忽略了
  • 为什么不使用列表或数组而不是单独设置和去重?

标签: java json spring spring-boot


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-26
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    相关资源
    最近更新 更多