[java] 잭슨 : 필드 직렬화를 방지하는 방법

비밀번호 필드가있는 엔티티 클래스가 있습니다.

class User {
    private String password;

    //setter, getter..
}

직렬화 중에이 필드를 건너 뛰고 싶습니다. 그러나 여전히 직렬화를 해제 할 수 있어야합니다. 이것은 클라이언트가 나에게 새 비밀번호를 보낼 수 있지만 현재 비밀번호를 읽을 수 없도록하는 데 필요합니다.

Jackson으로 어떻게이 작업을 수행합니까?



답변

로 표시 할 수 있습니다 @JsonIgnore.

1.9에서는 직렬화하지 않고 직렬화 해제하기 @JsonIgnore위해 getter, @JsonPropertysetter를 추가 할 수 있습니다 .


답변

StaxMan이 말한 것을 설명하면, 이것은 나를 위해 작동합니다

private String password;

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

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


답변

쉬운 방법은 게터와 세터에 주석을 달아주는 것입니다.

다음은 일반 텍스트 비밀번호를 제외하도록 수정 된 원래 예제이지만 비밀번호 필드를 암호화 된 텍스트로 리턴하는 새 메소드에 주석을 달았습니다.

class User {

    private String password;

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

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

    @JsonProperty("password")
    public String getEncryptedPassword() {
        // encryption logic
    }
}


답변

Jackson 2.6 부터 속성을 읽기 전용 또는 쓰기 전용으로 표시 할 수 있습니다. 두 접근 자의 주석을 해킹하는 것보다 간단하고 모든 정보를 한 곳에 보관합니다.

public class User {
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;
}


답변

이외에도 @JsonIgnore몇 가지 다른 가능성이 있습니다.

  • JSON보기 를 사용 하여 조건부로 필드를 필터링합니다 (기본적으로 역 직렬화에는 사용되지 않음; 2.0에서는 사용 가능하지만 직렬화, 역 직렬화에서는 다른보기를 사용할 수 있음)
  • @JsonIgnoreProperties 수업 중 유용 할 수 있습니다

답변

transient나를위한 해결책입니다. 감사! Java 고유이며 다른 프레임 워크 관련 주석을 추가하지 않아도됩니다.


답변

암호에 대해 공개 getter 메소드를 원하는 이유를 묻습니다. 최대 절전 모드 또는 다른 ORM 프레임 워크는 개인 getter 메소드를 사용합니다. 비밀번호가 올바른지 확인하려면 다음을 사용할 수 있습니다.

public boolean checkPassword(String password){
  return this.password.equals(anyHashingMethod(password));
}