Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug: JSON serialization ignores fields from child classes (Java 8 Lambda runtime works, Java 11 Lambda runtime fails) #358

Open
Dretch opened this issue Jul 28, 2022 · 5 comments

Comments

@Dretch
Copy link

Dretch commented Jul 28, 2022

I noticed this issue when updating my lambda function from Java 8 to Java 11, and it seems to be related to the code in this repository.

The problematic situation occurs when a lambda function declares that it returns TestParent, but actually returns an instance of TestChild:

  public class TestParent {

    public String parentField = "parentField";
  }

  public class TestChild extends TestParent {

    public String childField = "childField";
  }

To reproduce the issue, please run the attached test case (maven project): aws-lambda-json-child-field-bug.zip

It should fail with an error like below:

org.junit.ComparisonFailure: 
Expected :{"parentField":"parentField","childField":"childField"}
Actual   :{"parentField":"parentField"}

You can see that the fields from TestChild are missing. This is the issue, and this seems to be new -- in the Java 8 lambda runtime this worked ok.

Thanks for any help!

@msailes
Copy link
Collaborator

msailes commented Jul 28, 2022

Hi @Dretch,

I tried your sample and I couldn't get it to pass with Java 8. Could you provide a sample which is passing.

Thanks,

@Dretch
Copy link
Author

Dretch commented Jul 28, 2022

Thanks for looking @msailes

The issue does not seem to be Java 8 vs Java 11 per-se, but rather the Java 8 lambda runtime vs the Java 11 lambda runtime. So I am not expecting the test to pass simply using a Java 8 JRE.

I'm not sure if the code in this library even existed in the Java 8 lambda runtime, but nevertheless the code in this library does behave differently to the equivalent code in the Java 8 runtime.

Dretch pushed a commit to Dretch/java-11-lambda-missing-fields-poc that referenced this issue Aug 5, 2022
@Dretch
Copy link
Author

Dretch commented Aug 5, 2022

I have created a proof-of-concept that shows how the Java 8 runtime works but the Java 11 runtime does not: https://github.com/Dretch/java-11-lambda-missing-fields-poc (see project README).

Hopefully this helps to investigate the issue.

@msailes
Copy link
Collaborator

msailes commented Aug 12, 2022

Hi @Dretch,

You are correct, there is a difference between the two versions in this case. The fix would be to use the child type instead.

Thanks.

@Dretch
Copy link
Author

Dretch commented Aug 12, 2022

Hi @msailes ,

Unfortunately in my real application there is more than one child type, and which type will be used is not known until runtime - so it is not possible to statically declare the child type.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants