txusballesteros / android-transformer Goto Github PK
View Code? Open in Web Editor NEWAn Android library to manage your data transformations between your POJO objects.
License: Apache License 2.0
An Android library to manage your data transformations between your POJO objects.
License: Apache License 2.0
Hi,
I think this is a request for improvement because I didn't find how to do it with the current version, or maybe you can solve my problem.
I have a structure like this:
InboxItemEntity
NotificationEntity extends InboxItemEntity
TaskEntity extends InboxItemEntity
And I want to transform NotificationEntity and TaskEntity to NotificationBo and TaskBo. The configuration is like this:
@Mappable(with = NotificationBoResponse.class)
public class NotificationEntity extends InboxItemEntity {
@Mapped
private String senderId;
@Mapped
private String senderName;
}
@Mappable(with = TaskBoResponse.class)
public class TaskEntity extends InboxItemEntity {
@Mapped
private Date dueDate;
@Mapped
private Date lastCacheRefreshDate;
...
}
@Mappable(with = InboxItemBoResponse.class)
public class InboxItemEntity {
//InboxType
@Mapped
private String id;
...
}
And the execution of transformer:
InboxItemBoResponse inboxItemBoResponse = transformer
.transform(inboxItemEntity, InboxItemBoResponse.class);
So, in some cases inboxItemEntity is an instance of TaskEntity and in another cases is an instance of NotificationEntity and transformer transforms them with the transformer of the class, with TaskEntityMapper or NotificationEntityMapper, and then, not all the fields are copied.
So, is there any possibility to do it with the current version? If not, could it be possible to add some call to super.transform() in order to convert all the fields?
Thank you so much!
Hi ,
annotationProcessor is not working for 'com.mobandme:android-transformer-compiler:1.2' on android Studio 3.4.1
Shame that this library is not maintain anymore :( it has a great potential in my opinion to keep DO and DTO separated :(
Hi,
the library works, but if the source class and the destination class are not in the same folder (by the way, under different packages names), then it does not works and fails with following exception:
My DO classes are under
com.sample.do
and my DTO are under
com.sample.transporters.
The exception is the following:
java.lang.RuntimeException: java.lang.ClassNotFoundException: com.sample.do.transformer.Transformer
Thanks!
I've got a problem mapping multiple classes to the same class when they belong to the same package. For example:
Class A map to Class C
Class B map to Class C
Class A and B are in the same package.
The problems seems to be with the generated Transformer class (which is created by package) and that add 2 entries with the same key:
addMapper("com.example.model.C", new com.example.viewmodel.A());
addMapper("com.example.model.C", new com.example.viewmodel.B());
As a result when I try to transform class C to class A it works.
But when I try to transform class C to class B it give me a cast error: class A connot be cast to class B.
Hi,
I'm trying to use library, testing "How to use" case at first. Unfortunately app throws an exception:
03-23 09:43:14.372 27853-27853/com.example.app E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.app, PID: 27853 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.view.panicbutton.activity.PanicButtonActivity}: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.example.app.transformer.Transformer at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2924) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2985) at android.app.ActivityThread.-wrap14(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6692) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.example.app.transformer.Transformer at com.mobandme.android.transformer.Transformer.transform(Transformer.java:80) at com.mobandme.android.transformer.Transformer.transform(Transformer.java:56) at com.example.app.view.panicbutton.activity.PanicButtonActivity.onCreate(PanicButtonActivity.java:213) at android.app.Activity.performCreate(Activity.java:6912) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2877) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2985) at android.app.ActivityThread.-wrap14(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6692) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.example.app.transformer.Transformer at com.mobandme.android.transformer.Transformer.getTransformerInstance(Transformer.java:106) at com.mobandme.android.transformer.Transformer.transform(Transformer.java:75) at com.mobandme.android.transformer.Transformer.transform(Transformer.java:56) at com.example.app.view.panicbutton.activity.PanicButtonActivity.onCreate(PanicButtonActivity.java:213) at android.app.Activity.performCreate(Activity.java:6912) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2877) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2985) at android.app.ActivityThread.-wrap14(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6692) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) Caused by: java.lang.ClassNotFoundException: com.example.app.transformer.Transformer at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:400) at java.lang.Class.forName(Class.java:326) at com.mobandme.android.transformer.Transformer.getTransformerInstance(Transformer.java:101) at com.mobandme.android.transformer.Transformer.transform(Transformer.java:75) at com.mobandme.android.transformer.Transformer.transform(Transformer.java:56) at com.example.app.view.panicbutton.activity.PanicButtonActivity.onCreate(PanicButtonActivity.java:213) at android.app.Activity.performCreate(Activity.java:6912) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2877) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2985) at android.app.ActivityThread.-wrap14(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6692) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.app.transformer.Transformer" on path: DexPathList[[zip file "/data/app/com.example.app-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.app-2/lib/arm64, /data/app/com.example.app-2/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:380) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:400) at java.lang.Class.forName(Class.java:326) at com.mobandme.android.transformer.Transformer.getTransformerInstance(Transformer.java:101) at com.mobandme.android.transformer.Transformer.transform(Transformer.java:75) at com.mobandme.android.transformer.Transformer.transform(Transformer.java:56) at com.example.app.view.panicbutton.activity.PanicButtonActivity.onCreate(PanicButtonActivity.java:213) at android.app.Activity.performCreate(Activity.java:6912) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2877) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2985) at android.app.ActivityThread.-wrap14(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6692) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
My module build.gradle:
compileSdkVersion 27 buildToolsVersion '27.0.2'
...
provided 'com.mobandme:android-transformer:1.2' provided 'com.mobandme:android-transformer-compiler:1.2' annotationProcessor 'com.mobandme:android-transformer-compiler:1.2'
My app build.gradle:
`
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
classpath 'io.fabric.tools:gradle:1.+'
classpath 'com.google.gms:google-services:3.1.1'
}
`
Transforming code in Activity:
`
HomeModel model = new HomeModel();
model.Address = "sdadsf";
model.CityCode = "sdadasdasdsaf";
Transformer homeModelTransformer = new Transformer
.Builder()
.build(HomeModel.class);
//Converting your Model objects to your Domain objects.
Home home = (Home)homeModelTransformer.transform(model);
`
HomeModel class:
`
import com.mobandme.android.transformer.compiler.Mappable;
import com.mobandme.android.transformer.compiler.Mapped;
@mappable( with = Home.class )
public class HomeModel {
@Mapped
public String Address;
// If your objects does not contains the same names into their fields,
// you can configure the destiny name using the 'toField' parameter.
@Mapped( toField = "PostalCode")
public String CityCode;
}
`
Home class:
`
public class Home {
public String Address;
public String PostalCode;
}
`
Transformer & Mapper classes are generated correctly but app still throws exception
Hi,
I'm trying to transform a Realm object (I call it NotificationVo) to another POJO (called NotificationEntity)
NotificationVo has the annotation @Mappable(with = NotificationEntity.class)
and in every field the @Mapped annotation
.
Debugging a little, I've found that on AbstractTransformer class, when looking for a mapper on mapperList, the object I'm trying to convert is not in the list. That's because Realm uses proxy pattern and the cannonical name of the object is like this: io.realm.NotificationVoRealmProxy
and then mapper is null and throws a NullPointerException.
How can I avoid this? Am I doing something wrong?
Hi,
I'm having the following Issue:
"java.lang.ClassNotFoundException: com.myapp.domain.model.transformer.Transformer"
It occurs when Transformer.java try get instance of the generated "transformer.Transformer" class
I have two modules: domain and data.
I want to map one object from data module to another object in domain module.
I added the dependencies in data module (transformer library and compiler).
What's wrong here?
You could add some Annotations to help the compiler with null checking. Aswell why not declare the input of a mapper with @nonnull so the output wouldn't be null aswell and the user could save the nullcheck (aka why would I want to map a null object -> better check if it's null before mapping it).
Hi, I've seen there was already an List mapping issue.
Why not integrating the List mapping into the lib?
There just would be functions generated like this (actually there is a problem with the naming if the are more than 1 list conversions):
List<Home> home = homeModelTransformer.transform(modelList, Home.class);
public List<Home> transform(List<HomeModel> data) {
List<Home> homes = new ArrayList<>(data.size());
for (HomeModel homeModel: data) {
Home home = transform(homeModel);
if (home != null) {
homes.add(home);
}
}
return homes;
}
I think this would be very useful, cause people need to convert list often aswell.
This is a great library and it comes just in time for a project I am getting started on. Would you considering adding the ability to customize the transformation? By customization I mean performing additional operations on some fields rather than mapping them one to one.
Examples of where this would be useful:
Hi,
I would like the functionality to update a mapped class, so that I can update all mapped fields on it without destroying non-mapped fields.
// Initial object is set
model.Address = "home street";
assert toHome.Address != model.Address;
toHome.unmappedField = "retain";
homeModelTransformer.transformFrom(model, toHome);
// Check after updating
assert toHome.Address == "home street";
assert toHome.unmappedField == "retain";
I'm trying to parse between an ObservableArrayList<T>
to List<T>
doing something like
public class ObservableArrayListToListParser< T >
extends AbstractParser< ObservableArrayList< T >, List > {
@Override
protected List< T > onParse( ObservableArrayList< T > value ) {
return Arrays.asList( ( T[] ) value.toArray() );
}
}
But the code generated is:
result.setReservations(new ObservableArrayListToListParser().parse(data.getReservations()));
result.setRatings(new ObservableArrayListToListParser().parse(data.getRatings()));
So it crashes because of the lack of the generic parameters, because it returns of type object;
I think that this project has a really great potential.
At the moment, I configured my gradle like this:
implementation 'com.mobandme:android-transformer:1.2'
compileOnly 'com.mobandme:android-transformer-compiler:1.2'
and into gradle.properties:
android.enableBuildCache=true
android.enableD8=true
android.useAndroidX=true
android.enableSeparateAnnotationProcessing=true
android.enableJetifier=true
android.jetifier.blacklist = android-transformer-compiler
com.google.gms.googleservices.GoogleServicesPlugin.config.disableVersionCheck = true
and all works fine!
But if I try to build with android Studio 4.1, I've to remove
java.lang.Exception: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.android.app.transformer.Transformer
Seems after removing enableSeparateAnnotationProcessing=true from gradle.properties.
Any ideas?
how can I map list of objects using the transformer ?
Why the fields can not be private?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.