Skip to content

Version 1.6.x omits the fields provided as maps. #3793

@francisco-bru

Description

@francisco-bru

Expected behavior

In version 1.5.X given this mapper:

package org.foo;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

import java.util.List;
import java.util.Map;

@Mapper
public interface MessageConsumerDetailsMapper {

	@Mapping(target = "username", source = "username")
	MessageConsumerDetails mapToMessageConsumerDetails(final String username, Map<String, Object> userExtraInfo);

	default String map(final Object value) {
		return value != null ? value.toString() : null;
	}

	@SuppressWarnings("unchecked")
	default List<Integer> mapIntegerList(final Object value) {
		return value != null ? (List<Integer>) value : null;
	}
}

the mapperImpl generated is:

package org.foo;

import java.util.Map;
import javax.annotation.processing.Generated;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2024-12-19T12:24:49+0100",
    comments = "version: 1.5.0.Final, compiler: javac, environment: Java 21.0.2 (Eclipse Adoptium)"
)
public class MessageConsumerDetailsMapperImpl implements MessageConsumerDetailsMapper {

    @Override
    public MessageConsumerDetails mapToMessageConsumerDetails(String username, Map<String, Object> userExtraInfo) {
        if ( username == null && userExtraInfo == null ) {
            return null;
        }

        MessageConsumerDetails.MessageConsumerDetailsBuilder messageConsumerDetails = MessageConsumerDetails.builder();

        if ( userExtraInfo != null ) {
            if ( userExtraInfo.containsKey( "eventName" ) ) {
                messageConsumerDetails.eventName( map( userExtraInfo.get( "eventName" ) ) );
            }
            if ( userExtraInfo.containsKey( "messageId" ) ) {
                messageConsumerDetails.messageId( map( userExtraInfo.get( "messageId" ) ) );
            }
            if ( userExtraInfo.containsKey( "inboxId" ) ) {
                messageConsumerDetails.inboxId( map( userExtraInfo.get( "inboxId" ) ) );
            }
        }
        messageConsumerDetails.username( map( username ) );

        return messageConsumerDetails.build();
    }
}

Actual behavior

In version 1.6.X the mapperImp generated is:

package org.foo;

import java.util.Map;
import javax.annotation.processing.Generated;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2024-12-19T12:28:54+0100",
    comments = "version: 1.6.3, compiler: javac, environment: Java 21.0.2 (Eclipse Adoptium)"
)
public class MessageConsumerDetailsMapperImpl implements MessageConsumerDetailsMapper {

    @Override
    public MessageConsumerDetails mapToMessageConsumerDetails(String username, Map<String, Object> userExtraInfo) {
        if ( username == null && userExtraInfo == null ) {
            return null;
        }

        MessageConsumerDetails.MessageConsumerDetailsBuilder messageConsumerDetails = MessageConsumerDetails.builder();

        messageConsumerDetails.username( map( username ) );

        return messageConsumerDetails.build();
    }
}

The userExtraInfo is not used/mapped

Steps to reproduce the problem

mapstructTest.zip

attached project use 1.5.0.Final and everything is ok (mvn clean install)

change version of mapstruct to 1.6.3 and execute mvn clean install, test fail because the mapperImpl

MapStruct Version

1.6.3

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions