GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — Method with `@Condition` acts strange when applying to source · Issue #3459 · mapstruct/mapstruct Closed Labels Milestone DescriptionExpected behaviorwhen DTO toDto(E entity); @Condition default boolean isEntityAvailable(E entity) { if (entity == null) { return false; } return Persistence.getPersistenceUtil().isLoaded(entity); } hope to generate something like @Override public SubCategoryDto toDto(SubCategory entity) { if ( entity == null ) { return null; } if ( !isEntityAvailable( entity ) ) { return null; } SubCategoryDto.SubCategoryDtoBuilder<?, ?> subCategoryDto = SubCategoryDto.builder(); subCategoryDto.id( entity.getId() ); subCategoryDto.name( entity.getName() ); subCategoryDto.nick( entity.getNick() ); return SubCategoryDto.build(); } or just ignore it @Override public SubCategoryDto toDto(SubCategory entity) { if ( entity == null ) { return null; } SubCategoryDto.SubCategoryDtoBuilder<?, ?> subCategoryDto = SubCategoryDto.builder(); subCategoryDto.id( entity.getId() ); subCategoryDto.name( entity.getName() ); subCategoryDto.nick( entity.getNick() ); return SubCategoryDto.build(); } Actual behaviorbut now I got this @Override public SubCategoryDto toDto(SubCategory entity) { if ( entity == null ) { return null; } SubCategoryDto.SubCategoryDtoBuilder<?, ?> subCategoryDto = SubCategoryDto.builder(); if ( isEntityAvailable( entity ) ) { subCategoryDto.id( entity.getId() ); } if ( isEntityAvailable( entity ) ) { subCategoryDto.name( entity.getName() ); } if ( isEntityAvailable( entity ) ) { subCategoryDto.nick( entity.getNick() ); } return SubCategoryDto.build(); } Steps to reproduce the problemusing JPA with Mapstruct public interface EntityMapper<DTO extends EntityDto, E extends BasicEntity> { E toEntity(DTO dto); DTO toDto(E entity); // try to avoid JPA lazy loading issue // and this one worked well @Condition default boolean isCollectionAvailable(Collection<E> collection) { if (collection == null) { return false; } return Persistence.getPersistenceUtil().isLoaded(collection); } // try to avoid JPA lazy loading issue // got problem with this @Condition default boolean isEntityAvailable(E entity) { if (entity == null) { return false; } return Persistence.getPersistenceUtil().isLoaded(entity); } @MapperConfig(mappingControl = DeepClone.class, mappingInheritanceStrategy = MappingInheritanceStrategy.AUTO_INHERIT_ALL_FROM_CONFIG) interface Config { } } and entity mappers: @Mapper(config = EntityMapper.Config.class, uses = {SubCategoryMapper.class}) public interface ParentCategoryMapper extends EntityMapper<ParentCategoryDto, ParentCategory> { } @Mapper(config = EntityMapper.Config.class, uses = {ParentCategoryMapper.class}) public interface SubCategoryMapper extends EntityMapper<SubCategoryDto, SubCategory> { } and then I got this: @Override public SubCategoryDto toDto(SubCategory entity) { if ( entity == null ) { return null; } SubCategoryDto.SubCategoryDtoBuilder<?, ?> subCategoryDto = SubCategoryDto.builder(); // Calling isEntityAvailable() so much times does not make any sense. if ( isEntityAvailable( entity ) ) { subCategoryDto.id( entity.getId() ); } if ( isEntityAvailable( entity ) ) { subCategoryDto.name( entity.getName() ); } if ( isEntityAvailable( entity ) ) { subCategoryDto.nick( entity.getNick() ); } if ( isEntityAvailable( entity ) ) { subCategoryDto.theOrder( entity.getTheOrder() ); } if ( isEntityAvailable( entity ) ) { subCategoryDto.icon( entity.getIcon() ); } if ( isEntityAvailable( entity ) ) { subCategoryDto.link( entity.getLink() ); } // this is right if ( ParentCategoryMapper.isEntityAvailable( entity.getParentCategory() ) ) { subCategoryDto.parentCategory( ParentCategoryMapper.toDto( entity.getParentCategory() ) ); } return SubCategoryDto.build(); } and what I want is: @Override public SubCategoryDto toDto(SubCategory entity) { if ( entity == null ) { return null; } if ( !isEntityAvailable( entity ) ) { return null; } SubCategoryDto.SubCategoryDtoBuilder<?, ?> subCategoryDto = SubCategoryDto.builder(); subCategoryDto.id( entity.getId() ); subCategoryDto.name( entity.getName() ); subCategoryDto.nick( entity.getNick() ); subCategoryDto.theOrder( entity.getTheOrder() ); subCategoryDto.icon( entity.getIcon() ); subCategoryDto.link( entity.getLink() ); if ( ParentCategoryMapper.isEntityAvailable( entity.getParentCategory() ) ) { subCategoryDto.parentCategory( ParentCategoryMapper.toDto( entity.getParentCategory() ) ); } return SubCategoryDto.build(); } MapStruct VersionMapStruct 1.6.0.Beta1 Activity
MetadataMetadataAssigneesLabelsTypeProjectsMilestoneRelationshipsDevelopmentIssue actions |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |