mapstruct/NEXT_RELEASE_CHANGELOG.md
2024-07-20 16:29:17 +02:00

2.6 KiB

Enhancements

  • Breaking change: (#3574) - This reverts #2560, because we've decided that @BeanMapping(ignoreByDefault = true) should only be applied to target properties and not to source properties. Source properties are ignored anyway, the BeanMapping#unmappedSourcePolicy should be used to control what should happen with unmapped source policy

Bugs

  • Breaking change: Presence check method used only once when multiple source parameters are provided (#3601)
  • Fix @SubclassMapping not working with @BeanMapping#ignoreUnmappedSourceProperties (#3609)
  • Fix duplicate method generation with recursive auto mapping (#3591)

Documentation

  • Fix documentation of unmappedSourcePolicy default value (#3635)
  • Fix documentation link of before and after mapping when using builders (#3639)
  • Fix typo in experimental note (#3634)
  • Add example classes for the passing target type documentation (#3504)

Build

  • Enforce whitespaces around the for colon with CheckStyle (#3642)

Breaking changes

Presence checks for source parameters

In 1.6, support for presence checks on source parameters has been added. This means that even if you want to map a source parameter directly to some target property the new @SourceParameterCondition or @Condition(appliesTo = ConditionStrategy.SOURCE_PARAMETERS) should be used.

e.g.

If we had the following in 1.5:

@Mapper
public interface OrderMapper {

    @Mapping(source = "dto", target = "customer", conditionQualifiedByName = "mapCustomerFromOrder")
    Order map(OrderDTO dto);

    @Condition
    @Named("mapCustomerFromOrder")
    default boolean mapCustomerFromOrder(OrderDTO dto) {
        return dto != null && dto.getCustomerName() != null;
    }

}

Them MapStruct would generate

public class OrderMapperImpl implements OrderMapper {

    @Override
    public Order map(OrderDTO dto) {
        if ( dto == null ) {
            return null;
        }

        Order order = new Order();

        if ( mapCustomerFromOrder( dto ) ) {
            order.setCustomer( orderDtoToCustomer( orderDTO ) );
        }

        return order;
    }
}

In order for the same to be generated in 1.6, the mapper needs to look like this:

@Mapper
public interface OrderMapper {

    @Mapping(source = "dto", target = "customer", conditionQualifiedByName = "mapCustomerFromOrder")
    Order map(OrderDTO dto);

    @SourceParameterCondition
    @Named("mapCustomerFromOrder")
    default boolean mapCustomerFromOrder(OrderDTO dto) {
        return dto != null && dto.getCustomerName() != null;
    }

}