使用自定义映射器方法的Spring Mapping

时间:2019-04-02 09:48:03

标签: java mapstruct

我有两个对象,除了日期成员外,所有成员均相同。 在Obj1.date中是一个java.sql.Date,而Obj2.date中是一个长(历元)。

我需要编写一个映射器将obj1映射到obj2。这是我试图做的:

didUpdateLocations

但是mapperImpl仅具有自己的日期转换实现:

override private init() {
    super.init()

    // These settings mimick the settings we have in our production app
    locationManager.requestAlwaysAuthorization()
    locationManager.delegate = self
    locationManager.allowsBackgroundLocationUpdates = true
    locationManager.activityType = .automotiveNavigation
    locationManager.pausesLocationUpdatesAutomatically = false
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.distanceFilter = kCLDistanceFilterNone
}

func startLocating() {
    locationManager.startUpdatingLocation()
}

func stopLocating() {
    locationManager.stopUpdatingLocation()
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    guard lastLocation = locations.first else {
        return
    }

    print(lastLocation.speed) // This property is higher when connected to CarPlay
}

我得到:

@Named("sqlDateToEpoch")
default long sqlDateToEpoch(Date timestamp) throws ParseException {
    return myUtils.sqlDateToEpoch(timestamp);
}

@Mapping(source = "date", target = "date", qualifiedByName = "sqlDateToEpoch")
Obj2 toObj2(Obj1 source);

List<Obj2> toRecordList(List<Obj1> source);

进行这种转换的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我认为它不起作用的原因是因为您的source.getDate()返回的是String,而不是java.sql.Date。这导致MapStruct使用了从隐式Stringlong的转换。

要解决此问题,您要么需要确保source.getDate()返回java.sql.Date,要么需要添加一个将获得String并返回Long的方法。