有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用orika的java自定义映射

我正在使用Orika Mapper映射源类和目标类的字段

我可以完美地进行一对一映射

我在源类中有两个字段,如dateOfDeparture和dateOfArrival

我必须计算这些日期之间的差异,并映射到destination类中的“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”)


共 (2) 个答案

  1. # 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. # 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());
        }
      }
      ... 
    

    我希望这能帮助那些正在研究如何转换这样一个列表的人