#java #orika
#java #orika
Вопрос:
Я использую Orika Mapper для сопоставления моих полей исходного и целевого классов.
Я могу отлично выполнить взаимно однозначное сопоставление.
У меня есть два поля, такие как dateOfDeparture и dateOfArrival в исходном классе.
Я должен вычислить разницу между этими датами и сопоставить с полем «travelDuration» в классе назначения.
Ниже приведен класс mapper.
package com.tcs.Orika;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import ma.glasnost.orika.MapperFacade;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.converter.ConverterFactory;
import ma.glasnost.orika.impl.ConfigurableMapper;
import ma.glasnost.orika.impl.DefaultMapperFactory;
public class Mapper extends ConfigurableMapper {
public static void main(String[] args) throws ParseException {
/*Date Calculation*/
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-M-yyyy hh:mm:ss");
String dateOfDeparture = "31-08-1982 10:20:56";
String dateOfArrival = "31-08-1983 10:20:56";
Date date1 = dateFormat.parse(dateOfDeparture);
Date date2 = dateFormat.parse(dateOfArrival);
long diff = date2.getTime() - date1.getTime();
int noOfDays = (int) TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
/*set values to Source object*/
OrikaMapFrom objectMapFrom = new OrikaMapFrom();
OrikaMapTo objectMapTo = new OrikaMapTo();
objectMapFrom.setSource("Delhi");
objectMapFrom.setDestination("Amsterdam");
objectMapFrom.setDateOfDeparture(date1);
objectMapFrom.setDateOfArrival(date2);
/*Name Mapping when source and destination names are different*/
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
mapperFactory.classMap(OrikaMapFrom.class, OrikaMapTo.class)
.field("source", "sourcePlace")
.field("destination","destinationPlace")
.field(noOfDays,"travelDuration")--------------->facing error on this line
.register();
/*Value Mapping*/
MapperFacade mapper = mapperFactory.getMapperFacade();
objectMapTo = mapper.map(objectMapFrom, OrikaMapTo.class);
objectMapTo.setTravelDuration(noOfDays);
System.out.println(objectMapTo.getSourcePlace());
System.out.println(objectMapTo.getDestinationPlace());
System.exit(0);
}
}
пожалуйста, посоветуйте, как отобразить (noOfDays, «travelDuration»).
Ответ №1:
Вот способ для вашего случая:
public class Mapper {
public static void main(String[] args) throws ParseException {
/*Date Calculation*/
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-M-yyyy hh:mm:ss");
String dateOfDeparture = "31-08-1982 10:20:56";
String dateOfArrival = "31-08-1983 10:20:56";
Date date1 = dateFormat.parse(dateOfDeparture);
Date date2 = dateFormat.parse(dateOfArrival);
/*set values to Source object*/
OrikaMapFrom objectMapFrom = new OrikaMapFrom();
OrikaMapTo objectMapTo = new OrikaMapTo();
objectMapFrom.setSource("Delhi");
objectMapFrom.setDestination("Amsterdam");
objectMapFrom.setDateOfDeparture(date1);
objectMapFrom.setDateOfArrival(date2);
/*Name Mapping when source and destination names are different*/
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
mapperFactory.classMap(OrikaMapFrom.class, OrikaMapTo.class)
.field("source", "sourcePlace")
.field("destination","destinationPlace")
.customize(new CustomMapper<OrikaMapFrom,OrikaMapTo>() {
@Override
public void mapAtoB(OrikaMapFrom a, OrikaMapTo b, MappingContext mappingContext) {
long diff = a.getDateOfArrival().getTime() - a.getDateOfDeparture().getTime();
b.setTravelDuration((int)TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));
}
})
//.field(noOfDays,"travelDuration")--------------->facing error on this line
.register();
/*Value Mapping*/
MapperFacade mapper = mapperFactory.getMapperFacade();
objectMapTo = mapper.map(objectMapFrom, OrikaMapTo.class);
objectMapTo.setTravelDuration(noOfDays);
System.out.println(objectMapTo.getSourcePlace());
System.out.println(objectMapTo.getDestinationPlace());
System.exit(0);
}
}
Надеюсь, это может помочь.
Ответ №2:
Другой способ может быть с помощью CustomConverter
http://orika-mapper.github.io/orika-docs/converters.html
Я сделал какой-то конкретный конвертер (Список -> Список), например:
...
ConverterFactory converterFactory = BaseMapper.MAPPER_FACTORY.getConverterFactory();
converterFactory.registerConverter("orderListConverter", new OrderListConverter());
BaseMapper.MAPPER_FACTORY.classMap(ClientDTO.class, Client.class)
.fieldMap("orders", "orders").converter("orderListConverter").mapNulls(true).mapNullsInReverse(true).add()
.byDefault()
.register();
mapperFacade = BaseMapper.MAPPER_FACTORY.getMapperFacade();
...
class OrderListConverter extends BidirectionalConverter<List<Order>, List<Integer>> {
@Override
public List<Order> convertFrom(List<Integer> source, Type<List<Order>> destT) {
return source.stream().map(p -> (new Order()).setIdOrder(p)).collect(Collectors.toList());
}
@Override
public List<Integer> convertTo(List<Order> source, Type<List<Integer>> destT) {
return source.stream().map(p -> p.getIdOrder()).collect(Collectors.toList());
}
}
...
Я надеюсь, что это поможет кому-то, кто ищет, как преобразовать подобный список.
Комментарии:
1. Я чувствую, что этот способ помог мне больше, потому что мне нужно было повторно использовать мой пользовательский конвертер для нескольких полей.
2. mapperFacade.mapAsList может сделать то же самое для вас.