1. ホーム
  2. java

[解決済み] Spring MVCからJSONで送信する際にJavaオブジェクトのフィールドを動的に無視させる

2022-06-18 11:29:31

質問

私はhibernateのために、次のようなモデルクラスを持っています。

@Entity
@Table(name = "user", catalog = "userdb")
@JsonIgnoreProperties(ignoreUnknown = true)
public class User implements java.io.Serializable {

    private Integer userId;
    private String userName;
    private String emailId;
    private String encryptedPwd;
    private String createdBy;
    private String updatedBy;

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "UserId", unique = true, nullable = false)
    public Integer getUserId() {
        return this.userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    @Column(name = "UserName", length = 100)
    public String getUserName() {
        return this.userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Column(name = "EmailId", nullable = false, length = 45)
    public String getEmailId() {
        return this.emailId;
    }

    public void setEmailId(String emailId) {
        this.emailId = emailId;
    }

    @Column(name = "EncryptedPwd", length = 100)
    public String getEncryptedPwd() {
        return this.encryptedPwd;
    }

    public void setEncryptedPwd(String encryptedPwd) {
        this.encryptedPwd = encryptedPwd;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    @Column(name = "UpdatedBy", length = 100)
    public String getUpdatedBy() {
        return this.updatedBy;
    }

    public void setUpdatedBy(String updatedBy) {
        this.updatedBy = updatedBy;
    }
}

Spring MVCコントローラで、DAOを使用して、オブジェクトを取得し、JSONオブジェクトとして返すことができます。

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping(value = "/getUser/{userId}", method = RequestMethod.GET)
    @ResponseBody
    public User getUser(@PathVariable Integer userId) throws Exception {

        User user = userService.get(userId);
        user.setCreatedBy(null);
        user.setUpdatedBy(null);
        return user;
    }
}

ビュー部分はAngularJSを使っているので、以下のようなJSONが取得されます。

{
  "userId" :2,
  "userName" : "john",
  "emailId" : "[email protected]",
  "encryptedPwd" : "Co7Fwd1fXYk=",
  "createdBy" : null,
  "updatedBy" : null
}

暗号化されたパスワードを設定しない場合は、そのフィールドもNULLに設定します。

しかし、私はこのように、すべてのフィールドをクライアント側に送信したいわけではありません。もし、password、updatedby、createdbyの各フィールドを送信したくない場合、私の結果のJSONは以下のようになります。

{
  "userId" :2,
  "userName" : "john",
  "emailId" : "[email protected]"
}

クライアントに送信したくないフィールドのリストは、他のデータベーステーブルから来るものです。したがって、それはログインしているユーザーに基づいて変更されます。 どのようにそれを行うことができますか?

私はあなたが私の質問を得たことを願っています。

どのように解決するのですか?

を追加します。 @JsonIgnoreProperties("fieldname") アノテーションをPOJOに追加します。

または @JsonIgnore を、JSON のデシリアライズ時に無視したいフィールドの名前の前に記述します。例

@JsonIgnore
@JsonProperty(value = "user_password")
public String getUserPassword() {
    return userPassword;
}

GitHubの例