In this post, I am going to explain how to specify custom converter in an xml file.
Step 1: Define custom converter by implementing CustomConverter interface.
public class AppLogToTransactionLogConverter implements CustomConverter {
@Override
public Object convert(Object destination, Object source, Class<?> destinationClass, Class<?> sourceClass) {
if (source instanceof AppLog) {
AppLog appLog = (AppLog) source;
return new TransactionLog(appLog.getLogMessage(),
Date.from(Instant.ofEpochMilli(appLog.getCreatedTimeInMillis())));
}
else if (source instanceof TransactionLog) {
TransactionLog transactionLog = (TransactionLog) source;
return new AppLog(transactionLog.getMessage(), transactionLog.getCreatedDate().getTime());
}
throw new IllegalArgumentException("Invalid types");
}
}
Step 2: Specify the converter in xml file.
<configuration>
<custom-converters>
<converter
type="com.sample.app.converter.AppLogToTransactionLogConverter">
<class-a>com.sample.app.model.TransactionLog</class-a>
<class-b>com.sample.app.model.AppLog</class-b>
</converter>
</custom-converters>
</configuration>
In the above snippet, I am defining AppLogToTransactionLogConverter can be used to convert TransactionLog to AppLog instances and vice versa.
Find the below working application.
Step 1: Define AppLog and TransactionLog classes.
AppLog.java
package com.sample.app.model;
public class AppLog {
private String logMessage;
private long createdTimeInMillis;
public AppLog() {
}
public AppLog(String logMessage, long createdTimeInMillis) {
this.logMessage = logMessage;
this.createdTimeInMillis = createdTimeInMillis;
}
public String getLogMessage() {
return logMessage;
}
public void setLogMessage(String logMessage) {
this.logMessage = logMessage;
}
public long getCreatedTimeInMillis() {
return createdTimeInMillis;
}
public void setCreatedTimeInMillis(long createdTimeInMillis) {
this.createdTimeInMillis = createdTimeInMillis;
}
@Override
public String toString() {
return "AppLog [logMessage=" + logMessage + ", createdTimeInMillis=" + createdTimeInMillis + "]";
}
}
TransactionLog.java
package com.sample.app.model;
import java.util.Date;
public class TransactionLog {
private String message;
private Date createdDate;
public TransactionLog() {
}
public TransactionLog(String message, Date createdDate) {
this.message = message;
this.createdDate = createdDate;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Date getCreatedDate() {
return createdDate;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
@Override
public String toString() {
return "TransactionLog [message=" + message + ", createdDate=" + createdDate + "]";
}
}
Step 2: Define custom converter.
AppLogToTransactionLogConverter.java
package com.sample.app.converter;
import java.time.Instant;
import java.util.Date;
import org.dozer.CustomConverter;
import com.sample.app.model.AppLog;
import com.sample.app.model.TransactionLog;
public class AppLogToTransactionLogConverter implements CustomConverter {
@Override
public Object convert(Object destination, Object source, Class<?> destinationClass, Class<?> sourceClass) {
if (source instanceof AppLog) {
AppLog appLog = (AppLog) source;
return new TransactionLog(appLog.getLogMessage(),
Date.from(Instant.ofEpochMilli(appLog.getCreatedTimeInMillis())));
}
else if (source instanceof TransactionLog) {
TransactionLog transactionLog = (TransactionLog) source;
return new AppLog(transactionLog.getMessage(), transactionLog.getCreatedDate().getTime());
}
throw new IllegalArgumentException("Invalid types");
}
}
Step 3: Specify converter details in the configuration file.
appLog-to-transactionLog-mapping.xml
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
<configuration>
<custom-converters>
<converter
type="com.sample.app.converter.AppLogToTransactionLogConverter">
<class-a>com.sample.app.model.TransactionLog</class-a>
<class-b>com.sample.app.model.AppLog</class-b>
</converter>
</custom-converters>
</configuration>
</mappings>
Step 4: Define TypeConverterDemo class.
TypeConverterDemo.java
package com.sample.app;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import org.dozer.DozerBeanMapper;
import com.sample.app.model.AppLog;
import com.sample.app.model.TransactionLog;
public class TypeConverterDemo {
public static void main(String[] args) throws IOException {
DozerBeanMapper mapper = new DozerBeanMapper();
mapper.setMappingFiles(Arrays.asList("appLog-to-transactionLog-mapping.xml"));
TransactionLog transactionLog1 = new TransactionLog("Unable to connect to database", new Date());
AppLog appLog = mapper.map(transactionLog1, AppLog.class);
TransactionLog transactionLog2 = mapper.map(appLog, TransactionLog.class);
System.out.println(transactionLog1);
System.out.println(appLog);
System.out.println(transactionLog2);
}
}
Output
TransactionLog [message=Unable to connect to database, createdDate=Sun Feb 06 12:30:40 IST 2022] AppLog [logMessage=Unable to connect to database, createdTimeInMillis=1644130840006] TransactionLog [message=Unable to connect to database, createdDate=Sun Feb 06 12:30:40 IST 2022]
Previous Next Home
No comments:
Post a Comment