Shortly, I’d like to move this code inside a mapstruct mapper:
JavaScript
x
List<Provincia> provincies = resultSetType.getResults().getResult().stream()
.map(resultType -> ResultTypeToProvinciaMapper.INSTANCE.resultTypeToProvincia(resultType))
.collect(Collectors.toList());
I’d like to have:
JavaScript
List<Provincia> provinces = ResultTypeToProvinciaMapper.INSTANCE.getList(resultSet);
Details
My source class:
JavaScript
public class ResultSetType {
protected SearchRequestType request;
protected Results results;
protected Long resultCount;
protected Long totalCount;
protected Long startIndex;
protected Long pageSize;
protected ResultSetType.Errors errors;
// getters & setters
}
where Results
is:
JavaScript
public static class Results {
protected List<ResultType> result;
// geters & setters
}
And ResultType
:
JavaScript
public class ResultType {
protected String id;
protected String description;
// getters & setters
}
My Service
class is getting a ResultSetType
object from my Repository
:
JavaScript
@Service
@RequiredArgsConstructor
public class ServeiTerritorialServiceImpl implements ServeiTerritorialService {
private final ServeiTerritorialClientRepository serveiTerritorialClientRepository;
/**
* {@inheritDoc}
*/
@Override
public void getPaisos() {
ResultSetType resultSetType = this.serveiTerritorialClientRepository.getOid("2.16.724.4.400");
// here I need to map resultSetType to a List<Provincia>...
}
}
I need to map resultSetType
to List<Provincia>
.
So, I need to map resultSetType.results.result
to List<Provincia>
.
First of all, I’ve created a mapper
in order to map ResultType
to Provincia
:
JavaScript
@Mapper
public interface ResultTypeToProvinciaMapper {
ResultTypeToProvinciaMapper INSTANCE = Mappers.getMapper(ResultTypeToProvinciaMapper.class);
@Mapping(source = "id", target = "code")
@Mapping(source = "description", target = "name")
Provincia resultTypeToProvincia(ResultType resultType);
}
However, I can’t quite figure out how to travel from resultSetType.results.result
to List<Provincia>
.
Any ideas?
Advertisement
Answer
With MapStruct you can define mapping between different iterable. However, you can map from a nested listed into a top level list in a method (You can if it is wrapped though).
In any case for this I would suggest doing the following:
JavaScript
@Mapper
public interface ResultTypeToProvinciaMapper {
ResultTypeToProvinciaMapper INSTANCE = Mappers.getMapper(ResultTypeToProvinciaMapper.class);
default List<Provincia> resultSetToListOfProvincia(ResultSetType resultSetType) {
if (resultSetType == null) {
return null;
}
Results results = resultSetType.getResults();
if (results == null) {
return null;
}
return resultTypesToProvincias(results.getResult());
}
List<Provincia> resultTypesToProvincias(List<ResultType> resultTypes);
@Mapping(source = "id", target = "code")
@Mapping(source = "description", target = "name")
Provincia resultTypeToProvincia(ResultType resultType);
}