400

サーバーとの間で送受信されるユーザーオブジェクトがあります。ユーザーオブジェクトを送信するときに、ハッシュ化されたパスワードをクライアントに送信したくありません。そこで、@JsonIgnorepasswordプロパティを追加しましたが、これにより、パスワードへの逆シリアル化がブロックされ、パスワードを持っていないユーザーのサインアップが困難になります。

どうすれば@JsonIgnoreシリアル化のみに適用でき、逆シリアル化には適用できませんか?私はSpringJSONViewを使用しているので、を制御することはできませんObjectMapper

私が試したこと:

  1. @JsonIgnoreプロパティに追加
  2. @JsonIgnoregetterメソッドのみを追加します
4

8 に答える 8

603

正確にこれを行う方法は、使用しているジャクソンのバージョンによって異なります。これはバージョン1.9@JsonIgnore前後で変更されましたが、それ以前は、ゲッターに追加することでこれを行うことができました。

あなたが試したもの:

getterメソッドにのみ@JsonIgnoreを追加します

これを行い@JsonProperty、JSON「パスワード」フィールド名の特定のアノテーションをオブジェクトのパスワードのsetterメソッドに追加します。

ジャクソンのより最近のバージョンでは、の注釈引数が追加されREAD_ONLYWRITE_ONLYJsonPropertyます。したがって、次のようなこともできます。

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;

ドキュメントはここにあります。

于 2012-09-20T01:53:47.410 に答える
113

これを実現するために必要なのは、2つの注釈だけです。

  1. @JsonIgnore
  2. @JsonProperty

@JsonIgnoreクラスメンバーとそのゲッター、および@JsonPropertyそのセッターで使用します。サンプルの図はこれを行うのに役立ちます:

class User {

    // More fields here
    @JsonIgnore
    private String password;

    @JsonIgnore
    public String getPassword() {
        return password;
    }

    @JsonProperty
    public void setPassword(final String password) {
        this.password = password;
    }
}
于 2014-12-09T18:37:02.323 に答える
96

バージョン2.6以降:より直感的な方法はcom.fasterxml.jackson.annotation.JsonProperty、フィールドで注釈を使用することです。

@JsonProperty(access = Access.WRITE_ONLY)
private String myField;

ゲッターが存在する場合でも、フィールド値はシリアル化から除外されます。

JavaDocによると:

/**
 * Access setting that means that the property may only be written (set)
 * for deserialization,
 * but will not be read (get) on serialization, that is, the value of the property
 * is not included in serialization.
 */
WRITE_ONLY

逆に必要な場合は、を使用してAccess.READ_ONLYください。

于 2015-12-08T14:22:34.190 に答える
16

私の場合、Spring MVCコントローラーから返すオブジェクトをJacksonが自動的に(逆)シリアル化します(Spring 4.1.6で@RestControllerを使用しています)。私はcom.fasterxml.jackson.annotation.JsonIgnore代わりに使用org.codehaus.jackson.annotate.JsonIgnoreしなければなりませんでした、そうでなければ、それは単に何もしませんでした。

于 2015-06-22T15:45:53.693 に答える
4

これを処理するもう1つの簡単な方法allowSetters=trueは、アノテーションで引数を使用することです。これにより、パスワードをdtoに逆シリアル化できますが、containsオブジェクトを使用する応答本文にパスワードをシリアル化することはできません。

例:

@JsonIgnoreProperties(allowSetters = true, value = {"bar"})
class Pojo{
    String foo;
    String bar;
}

fooとの両方barがオブジェクトに入力されますが、応答本文にはfooのみが書き込まれます。

于 2019-12-10T23:11:33.050 に答える
3
"user": {
        "firstName": "Musa",
        "lastName": "Aliyev",
        "email": "klaudi2012@gmail.com",
        "passwordIn": "98989898", (or encoded version in front if we not using https)
        "country": "Azeribaijan",
        "phone": "+994707702747"
    }

@CrossOrigin(methods=RequestMethod.POST)
@RequestMapping("/public/register")
public @ResponseBody MsgKit registerNewUsert(@RequestBody User u){

        root.registerUser(u);

    return new MsgKit("registered");
}  

@Service
@Transactional
public class RootBsn {

    @Autowired UserRepository userRepo;

    public void registerUser(User u) throws Exception{

        u.setPassword(u.getPasswordIn());
        //Generate some salt and  setPassword (encoded -  salt+password)
        User u=userRepo.save(u);

        System.out.println("Registration information saved");
    }

}

    @Entity        
@JsonIgnoreProperties({"recordDate","modificationDate","status","createdBy","modifiedBy","salt","password"})
                    public class User implements Serializable {
                        private static final long serialVersionUID = 1L;

                        @Id
                        @GeneratedValue(strategy=GenerationType.AUTO)
                        private Long id;

                        private String country;

                        @Column(name="CREATED_BY")
                        private String createdBy;

                        private String email;

                        @Column(name="FIRST_NAME")
                        private String firstName;

                        @Column(name="LAST_LOGIN_DATE")
                        private Timestamp lastLoginDate;

                        @Column(name="LAST_NAME")
                        private String lastName;

                        @Column(name="MODIFICATION_DATE")
                        private Timestamp modificationDate;

                        @Column(name="MODIFIED_BY")
                        private String modifiedBy;

                        private String password;

                        @Transient
                        private String passwordIn;

                        private String phone;

                        @Column(name="RECORD_DATE")
                        private Timestamp recordDate;

                        private String salt;

                        private String status;

                        @Column(name="USER_STATUS")
                        private String userStatus;

                        public User() {
                        }
                // getters and setters
                }
于 2016-05-01T11:13:20.033 に答える
2

クラスレベルで@JsonIgnorePropertiesを使用し、「value」パラメーターのjsonにigonreする変数を配置できます。問題なく動作しました。

@JsonIgnoreProperties(value = { "myVariable1","myVariable2" })
public class MyClass {
      private int myVariable1;,
      private int myVariable2;
}
于 2020-07-06T08:54:37.117 に答える
2

次のようにすることもできます。

@JsonIgnore
@JsonProperty(access = Access.WRITE_ONLY)
private String password;

それは私のために働いた

于 2020-08-22T16:28:58.983 に答える