Netflix / dgs-codegen

Apache License 2.0
177 stars 92 forks source link

Fields with capital letters in the beginning are not deserialised by jackson. java #679

Open Nazukin-Dmitry opened 2 months ago

Nazukin-Dmitry commented 2 months ago

Hello. We have third party schema, where some fields begin with a capital letter. As example:

type Query {
  user(id: Int): User
}

type User {
  ESIAPassport: String
  firstName: String
}

Generated java class for User looks like:

public class User {
  private String ESIAPassport;

  private String firstName;

  public String getESIAPassport() {
    return ESIAPassport;
  }

  public void setESIAPassport(String ESIAPassport) {
    this.ESIAPassport = ESIAPassport;
  }

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
}

We receive response like:

{
  "data": {
    "user": {
      "firstName": "A",
      "ESIAPassport": "1234"
    }
  }
}

If we try to read user object, then field ESIAPassport will not be deserialised by jackson, because jackson analyses setter name and expects json to contain field esiapassport.

        ObjectMapper objectMapper = new ObjectMapper()
                .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        String response = """
                {
                  "firstName": "A",
                  "ESIAPassport": "1234"
                }
                """;
        User user = objectMapper.readValue(response, User.class);

        assertEquals("A", user.getFirstName()); // ok
        assertEquals("1234", user.getESIAPassport()); // fails

I suppose fix would be to add @JsonProperty annotation on getter or both getter and setter - looks like it doesn't matter for jackson.