잭슨 + 빌더 패턴?
Jackson이 다음 생성자를 사용하여 클래스를 역 직렬화하기를 원합니다.
public Clinic(String name, Address address)
첫 번째 인수를 역 직렬화하는 것은 쉽습니다. 문제는 주소가 다음과 같이 정의된다는 것입니다.
public class Address {
private Address(Map<LocationType, String> components)
...
public static class Builder {
public Builder setCity(String value);
public Builder setCountry(String value);
public Address create();
}
}
다음과 같이 구성됩니다. new Address.Builder().setCity("foo").setCountry("bar").create();
주소를 직접 구성하기 위해 Jackson에서 키-값 쌍을 얻는 방법이 있습니까? 또는 Jackson이 Builder 클래스 자체를 사용하도록하는 방법이 있습니까?
Jackson 2+를 사용하는 한 이제 이를 지원하는 기능이 내장되어 있습니다.
먼저이 주석을 Address클래스 에 추가해야합니다 .
@JsonDeserialize(builder = Address.Builder.class)
그런 다음이 주석을 Builder클래스 에 추가해야합니다 .
@JsonPOJOBuilder(buildMethodName = "create", withPrefix = "set")
빌드 할 Builder의 create 메서드와 set 대신 접두사가 붙을 Builder의 setter의 이름을 바꾸고 싶다면이 두 번째 주석을 건너 뛸 수 있습니다.
전체 예 :
@JsonDeserialize(builder = Address.Builder.class)
public class Address
{
private Address(Map<LocationType, String> components)
...
@JsonPOJOBuilder(buildMethodName = "create", withPrefix = "set")
public static class Builder
{
public Builder setCity(String value);
public Builder setCountry(String value);
public Address create();
}
}
@Rupert Madden-Abbott의 답변이 작동합니다. 그러나 기본이 아닌 생성자가있는 경우 (예 :
Builder(String city, String country) {...}
그런 다음 아래와 같이 매개 변수에 주석을 추가해야합니다.
@JsonCreator
Builder(@JsonProperty("city") String city,
@JsonProperty("country") String country) {...}
다음과 같이 @JsonDeserialize를 사용하여 이것을 구현했습니다.
@JsonDeserialize(using = JacksonDeserializer.class)
public class Address
{...}
@JsonCachable
static class JacksonDeserializer extends JsonDeserializer<Address>
{
@Override
public Address deserialize(JsonParser parser, DeserializationContext context)
throws IOException, JsonProcessingException
{
JsonToken token = parser.getCurrentToken();
if (token != JsonToken.START_OBJECT)
{
throw new JsonMappingException("Expected START_OBJECT: " + token, parser.getCurrentLocation());
}
token = parser.nextToken();
Builder result = new Builder();
while (token != JsonToken.END_OBJECT)
{
if (token != JsonToken.FIELD_NAME)
{
throw new JsonMappingException("Expected FIELD_NAME: " + token, parser.getCurrentLocation());
}
LocationType key = LocationType.valueOf(parser.getText());
token = parser.nextToken();
if (token != JsonToken.VALUE_STRING)
{
throw new JsonMappingException("Expected VALUE_STRING: " + token, parser.getCurrentLocation());
}
String value = parser.getText();
// Our Builder allows passing key-value pairs
// alongside the normal setter methods.
result.put(key, value);
token = parser.nextToken();
}
return result.create();
}
}
이 경우 저에게 적합한 솔루션입니다 ( "Lombok"빌더 주석 사용).
@Getter
@Builder(builderMethodName = "builder")
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@JsonAutoDetect(
fieldVisibility = JsonAutoDetect.Visibility.ANY,
creatorVisibility = JsonAutoDetect.Visibility.ANY
)
나는 당신에게도 유용하기를 바랍니다.
현재 빌더 패턴에 대한 지원은 없지만 꽤 오래 전에 요청되었습니다 (그리고 마지막으로 Jira 문제 http://jira.codehaus.org/browse/JACKSON-469 가 제출되었습니다)-추가 될 수 있습니다. 충분한 수요가있는 경우 1.8 릴리스를 위해 (Jira에서 투표해야합니다!) 합리적인 추가 기능이며 개발자가 보유한 시간만큼만 지연됩니다. 그러나 나는 그것이 큰 도움이 될 것이라고 생각합니다.
참고URL : https://stackoverflow.com/questions/4982340/jackson-builder-pattern
'Program Club' 카테고리의 다른 글
| Mercurial이 커밋에 사용하는 사용자 이름을 어떻게 설정합니까? (0) | 2020.10.18 |
|---|---|
| RS232 직렬 포트 위조 (0) | 2020.10.18 |
| Sass 잘못된 CSS 오류 : "예상 된 표현" (0) | 2020.10.18 |
| 더 나은 객체 지향 프로그래밍을 어떻게 연습 할 수 있습니까? (0) | 2020.10.17 |
| DropDownListFor Not 선택 값 (0) | 2020.10.17 |