Contribution · MapStruct · Annotation Processor
MapStruct — fluent setter 속성명 일치 버그 수정
Lombok @Builder 스타일의 fluent setter가 JavaBean accessor와 서로 다른 속성명으로 인식되어 두 번째 글자가 대문자인 필드의 매핑이 누락되던 #4000 버그를 수정했습니다. DefaultAccessorNamingStrategy의 fluent setter 분기를 JavaBean 쪽과 동일한 decapitalize 규칙으로 정렬하고 회귀 테스트를 추가했습니다.
문제 — #4000
소스에 private String xNameField가 있고 타겟에 Lombok @Builder가 생성하는 Builder.xNameField(...) fluent setter가 있는 단순 매핑에서 해당 필드가 조용히 누락되고 있었습니다. 소스 getter getXNameField()는 Introspector.decapitalize 규칙(두 글자 모두 대문자면 유지)에 따라 속성명 XNameField로 인식되는 반면, fluent setter 쪽은 메서드명을 그대로 사용해 xNameField로 인식되어 둘이 매칭되지 않았기 때문.
수정
DefaultAccessorNamingStrategy#getPropertyName(...)의 fluent setter 분기에 JavaBean 쪽과 동일한 decapitalize 규칙을 적용. xNameField → 첫 글자 capitalize → XNameField → decapitalize → XNameField로 정규화돼 소스 쪽 속성명과 일치합니다. 두 번째 글자가 소문자인 일반적인 fluent setter(settlementDate(...))는 동작이 바뀌지 않습니다(SettlementDate → settlementDate).
회귀 테스트
기존 _1799 fluent setter 테스트 패턴을 그대로 따라 processor/src/test/java/org/mapstruct/ap/test/bugs/_4000/에 Source(getXNameField), Target(Lombok 스타일 Builder.xNameField(...) fluent setter), Issue4000Mapper, Issue4000Test를 추가. 로컬에서 builder / superbuilder / _1799 영역 82개 테스트 회귀 모두 통과.
PR
- PR #4074 #4000 Fix property name resolution for fluent setters whose second character is upper case open
관련 자료
- Projectmapstruct/mapstruct
- Issuemapstruct/mapstruct#4000
- Authorgithub.com/BK202503
- Blogdevbilllab.tistory.com