2017-03-03 1 views
2

Jackson은 내 부울 필드를 has 게터 메소드로 처리하지 않습니다. 예를 들어 animal.hasLegs() 인 경우 legs 필드는 legs 필드가없는 JSON 객체를 반환합니다. 부울 필드 awesome의 경우 게터 메소드 (person.isAwesome())와 작동합니다.어떻게 잭슨과 부울에 'has'메소드 명명 규칙을 사용할 수 있습니까?

부울 필드에 대해 Jackson이 has 메소드 명명 규칙을 사용하게하려면 어떻게해야합니까?

+0

참고 : "이"이름 지정 규칙이 없습니다. "is"규칙은 JavaBeans 스펙 (심지어 예외 임에도 불구하고)에 정의되어 있으므로 "has", "can", "should"또는 다른 유사한 접두어가있는 부울에 대한 getter를 만들어 많은 응용 프로그램을 손상시킬 수 있습니다. 아무도 추가 게터를 만들지 못하게합니다. – Kayaman

+0

@Kayaman 공식적이지는 않지만'has'라는 이름을 사용하는 것이 일반적입니다. 예를 들어,이 질문을 확인해보십시오 : http://stackoverflow.com/questions/3874350/naming-conventions-for-java-methods-that-return-booleanno-question-mark – Jelle

+0

그것은 아직 사양에 나와 있지 않습니다. 사양에 있다면 자동으로 작동합니다. – Kayaman

답변

1
  1. 주석 모두 @JsonGetterhasXXX() 방법이 필요했습니다.

    @JsonGetter 
    public boolean hasAwesome() { ... } 
    
  2. JSON 필드에 메소드 이름에서 매핑 이름을 변경하는 사용자 정의 PropertyNamingStrategy 설정 :이 get로 시작하지 않기 때문에 그렇지 않으면 잭슨, 모두에서이 속성을 사용하지 않습니다. 기본적으로 hasXXX이라는 JSON 필드가 생성됩니다.

    ObjectMapper mapper = ... 
    mapper.setPropertyNamingStrategy(new PropertyNamingStrategy() { 
        @Override 
        public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) { 
         String prefix = "has"; 
         if (defaultName.startsWith(prefix)) { 
          String withoutHas = defaultName.replace(prefix, ""); 
          char firstLower = Character.toLowerCase(withoutHas.charAt(0)); 
          return firstLower + withoutHas.substring(1); 
         } 
         return super.nameForGetterMethod(config, method, defaultName); 
        } 
    });