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


163

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

class User {
    private String password;

    //setter, getter..
}

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

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


1
직렬화하고 싶지 않지만 직렬화를 해제하고 싶습니까? 불가능합니다. 상자에 쿠키를 넣지 않으면이 상자에서 쿠키를 검색 할 수 없습니다.
Alexis Dufrenoy

1
@Traroth : 새 쿠키를 넣을 수 있습니다. 편리한 주석을 찾고 있지만 손으로 ​​직접 수행 할 수 있습니다.
weekens

8
빠른 설명 : 기술적으로는 세터를 사용하고 (개인 설정도 자동 감지 됨) 접근자를 생략 할 수 있습니다 (공개 필드 나 게터 없음). @JsonIgnoregetter 에 추가 할 수도 있지만 @JsonPropertysetter 에 추가 할 수 있습니다.이 경우 일이 직렬화되지 않지만 직렬화 해제 될 수 있습니다.
StaxMan

4
이 질문에 대한 답변을 받아 주시겠습니까? (다른 두 사람은 몇 살이고 여전히 받아 들일 수 없습니다 ... 검토해보십시오!) :) 전체 공개-이 질문에 대한 답변이 없습니다.
Barett

답변:


187

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

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


6
@JsonIgnore는 역 직렬화도 방지합니다. 일시적인 경우-확인하겠습니다.
weekens

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

StaxMan의 의견이 답이되어야합니까? 왜 여전히 주석입니다 ...! ..?
Saravanabalagi Ramachandran

과도가 나를 위해 작동하지 않는 것 같습니다. 필드를 "과도"로 표시하여 필드를 평온 화 / 역 직렬화하고 싶지 않습니다.
rohith

이 답변은 이전에 transient(와 같이 private transient String password;) 사용을 제안 했지만 MapperFeature.PROPAGATE_TRANSIENT_MARKER 가 활성화되어 있지 않으면 퍼블릭 게터가있는 과도 필드는 무시 됩니다 .
tom

96

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

private String password;

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

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

12
어떤 Json 종속성을 사용하십니까? com.fasterxml.jackson에서는 작동하지 않습니다
Alexander Burakevych

3
감사! @JsonIgnore현장에서 필요하지 않은 것 같습니다.
Ferran Maylinch

com.jackson-annotations- <version> .jar에서
com.fasterxml.jackson.annotation.JsonIgnore

나는 이것을 시도했지만 그것은 나를 위해 작동하지 않습니다. v2.8을 사용합니다. 어떤 도움?
Maz

36

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

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

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
    }
}

21

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

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

이것은 간단하고 작동하는 멋진 솔루션입니다. 감사.
dhqvinh

17

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

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

10

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


2
당신의 속성이 포함 ORM, 정말 과도하지 않은 경우 나는 잭슨에 고정 될 수 있지만 그 작품은, 예를 들어 .... 찾을 수 @JsonIgnore는, 내 경우에는 더 흥미로운 일이 될,하지만 그것은 좋은 트레이드 오프입니다
주앙 페헤이라

3
고유 한 주석을 작성하고 JsonIgnore 및 JacksonAnnotationsInside로 주석을 달면 잭슨에 고정 될 필요가 없습니다. 이렇게하면 serializer를 변경하면 고유 한 주석 만 변경하면됩니다.
DavidA

4

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

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

실제로 이것이 솔루션에 대해 생각하는 가장 좋은 방법이라고 생각합니다. 개인에게 필요한 것을 만들고 객체 자체에서 제어하는 ​​것이 더 합리적입니다.
arcynum

2

Jackson에는 직렬화 및 역 직렬화 중에 필드를 필터링하는 데 도움이되는 SimpleBeanPropertyFilter라는 클래스가 있습니다. 전 세계적으로는 아닙니다. 나는 그것이 당신이 원하는 것이라고 생각합니다.

@JsonFilter("custom_serializer")
class User {
    private String password;

    //setter, getter..
}

그런 다음 코드에서 :

String[] fieldsToSkip = new String[] { "password" };

ObjectMapper mapper = new ObjectMapper();

final SimpleFilterProvider filter = new SimpleFilterProvider();
filter.addFilter("custom_serializer",
            SimpleBeanPropertyFilter.serializeAllExcept(fieldsToSkip));

mapper.setFilters(filter);

String jsonStr = mapper.writeValueAsString(currentUser);

이렇게하면 password필드가 직렬화되지 않습니다. 또한 password필드를 그대로 직렬화 해제 할 수 있습니다 . ObjectMapper 객체에 필터가 적용되지 않았는지 확인하십시오.

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(yourJsonStr, User.class);    // user object does have non-null password field

0

변수를로 설정

J

이것은 변수가 json serializer에 의해 건너 뛸 수있게합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.