주석을 사용하지 않는 잭슨의 필드를 제외하려면 어떻게 해야 합니까?
렌더링 전에 이름별로 일부 필드를 제외해야 합니다.필드 목록이 동적이어서 주석을 사용할 수 없습니다.
커스텀 시리얼라이저를 작성하려고 했지만 필드명을 취득할 수 없습니다.
GSON에서 사용한ExclusionStrategy
하지만 잭슨은 그런 기능을 가지고 있지 않습니다.동등한 것이 있나요?
이름별로 필드를 제외하는 다음 예는 제 블로그 게시물인 Gson v Jackson - Part 4에서 볼 수 있습니다(검색:PropertyFilterMixIn
.) 이 예에서는 다음 명령어를 사용하는 방법을 보여 줍니다.FilterProvider
와 함께SimpleBeanPropertyFilter
로.serializeAllExcept
사용자가 지정한 필드 이름 목록.
@JsonFilter("filter properties by name")
class PropertyFilterMixIn {}
class Bar
{
public String id = "42";
public String name = "Fred";
public String color = "blue";
public Foo foo = new Foo();
}
class Foo
{
public String id = "99";
public String size = "big";
public String height = "tall";
}
public class JacksonFoo
{
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
mapper.getSerializationConfig().addMixInAnnotations(
Object.class, PropertyFilterMixIn.class);
String[] ignorableFieldNames = { "id", "color" };
FilterProvider filters = new SimpleFilterProvider()
.addFilter("filter properties by name",
SimpleBeanPropertyFilter.serializeAllExcept(
ignorableFieldNames));
ObjectWriter writer = mapper.writer(filters);
System.out.println(writer.writeValueAsString(new Bar()));
// output:
// {"name":"James","foo":{"size":"big","height":"tall"}}
}
}
(주의: 관련 API는 최근 Jackson 릴리즈에서 약간 변경되었을 수 있습니다.)
이 예에서는 불필요해 보이는 주석을 사용하지만 제외되는 필드에는 주석을 적용하지 않습니다.(API를 변경하여 필요한 설정을 심플하게 하려면 , 주저하지 말고 JACKON-274의 실장에 투표해 주세요.
저는 비슷한 사용 사례에 대처하기 위해 도서관을 썼습니다.사용자가 데이터를 요청하는 필드를 프로그래밍 방식으로 무시해야 했습니다.일반적인 잭슨의 선택은 너무 강압적이었고, 나는 내 코드가 그렇게 보이는 것이 싫었다.
도서관은 이 모든 것을 훨씬 더 쉽게 이해할 수 있게 한다.다음과 같이 간단하게 할 수 있습니다.
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.monitorjbl.json.JsonView;
import com.monitorjbl.json.JsonViewSerializer;
import static com.monitorjbl.json.Match.match;
//initialize jackson
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(JsonView.class, new JsonViewSerializer());
mapper.registerModule(module);
//get a list of the objects
List<MyObject> list = myObjectService.list();
String json;
if(user.getRole().equals('ADMIN')){
json = mapper.writeValueAsString(list);
} else {
json = mapper.writeValueAsString(JsonView.with(list)
.onClass(MyObject.class, match()
.exclude("*")
.include("name")));
}
System.out.println(json);
코드는 GitHub에서 사용할 수 있습니다. 도움이 되길 바랍니다!
두 개 이상의 pojo에 정의된 필터가 있는 경우 다음을 수행할 수 있습니다.
@JsonFilter("filterAClass")
class AClass
{
public String id = "42";
public String name = "Fred";
public String color = "blue";
public int sal = 56;
public BClass bclass = new BClass();
}
//@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
@JsonFilter("filterBClass")
class BClass
{
public String id = "99";
public String size = "90";
public String height = "tall";
public String nulcheck =null;
}
public class MultipleFilterConcept {
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
// Exclude Null Fields
mapper.setSerializationInclusion(Inclusion.NON_NULL);
String[] ignorableFieldNames = { "id", "color" };
String[] ignorableFieldNames1 = { "height","size" };
FilterProvider filters = new SimpleFilterProvider()
.addFilter("filterAClass",SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames))
.addFilter("filterBClass", SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames1));
ObjectWriter writer = mapper.writer(filters);
System.out.println(writer.writeValueAsString(new AClass()));
}
}
Jackson은 이와 같은 대부분의 작업에 주석을 사용합니다. 그러나 가치 클래스에 직접 주석을 달 필요는 없습니다."주석 삽입"을 사용할 수도 있습니다(http://www.cowtowncoder.com/blog/archives/2009/08/entry_305.html) 참조).
그리고 기본 이상의 옵션을 사용할 수 있습니다.@JsonIgnore
(매수 단위) 또는@JsonIgnoreProperties
(클래스별), http://www.cowtowncoder.com/blog/archives/2011/02/entry_443.html 참조
저는 Squiggly Filter라는 라이브러리를 작성했습니다.이것은 Facebook Graph API 구문의 서브셋에 근거해 필드를 선택합니다.예를 들어 사용자 객체의 주소 필드의 zipCode를 선택하려면 쿼리 문자열을 사용합니다.?fields=address{zipCode}
Squiggly Filter의 장점 중 하나는 json을 렌더링하는 Object Mapper에 액세스할 수 있는 한 컨트롤러 메서드의 코드를 변경할 필요가 없다는 것입니다.
servlet API를 사용하는 경우 다음 작업을 수행할 수 있습니다.
1) 필터 등록
<filter>
<filter-name>squigglyFilter</filter-name>
<filter-class>com.github.bohnman.squiggly.web.SquigglyRequestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>squigglyFilter</filter-name>
<url-pattern>/**</url-pattern>
</filter-mapping>
2) Object Mapper 초기화
Squiggly.init(objectMapper, new RequestSquigglyContextProvider());
3) 이제 json을 필터링할 수 있습니다.
curl https://yourhost/path/to/endpoint?fields=field1,field2{nested1,nested2}
스퀴글리 필터에 대한 자세한 내용은 github에서 확인할 수 있습니다.
언급URL : https://stackoverflow.com/questions/13764280/how-do-i-exclude-fields-with-jackson-not-using-annotations
'programing' 카테고리의 다른 글
반응: 모달 열 때 스크롤 방지 (0) | 2023.03.23 |
---|---|
실패한 폼 propType: "onChange" 핸들러가 없는 폼 필드에 "값" 프로포트를 제공했습니다. (0) | 2023.03.23 |
Woocommerce : 모든 제품 업데이트 기능 (0) | 2023.03.23 |
서블릿과 웹 서비스의 차이점 (0) | 2023.03.23 |
MySQL 데이터베이스 연결 IIS10을 설정하는 동안 WordPress 오류 발생 (0) | 2023.03.23 |