Azure / autorest.java

Extension for AutoRest (https://github.com/Azure/autorest) that generates Java code
MIT License
33 stars 82 forks source link

[azure-json] When property is read-only, package-private setter method's parameter type seems wrong #2805

Closed XiaofeiCao closed 3 months ago

XiaofeiCao commented 3 months ago

Current package-private setter's parameter type is wiredType instead of clientType(compared to that of public setter). https://github.com/Azure/autorest.java/blob/31146cf2e4934ad369fd424be19207c0cce320e4/javagen/src/main/java/com/azure/autorest/template/ModelTemplate.java#L223-L226

The issue is that when a read-only property is defined in parent, child class's fromJson will have type incompatible issue.

e.g. property defined in parent:

// read-only property
private DateTimeRfc1123 rfc1123NonRequired;

// package-private setter
TransformationAsRequiredFields setRfc1123NonRequired(DateTimeRfc1123 rfc1123NonRequired){}

In child fromJson:

return jsonReader.readObject(reader -> {
  // local var is initialized as `OffsetDateTime`, due to the property is defined in parent
  OffsetDateTime rfc1123NonRequired = null;
  while (reader.nextToken() != JsonToken.END_OBJECT) {
    String fieldName = reader.getFieldName();
    reader.nextToken();
    if ("rfc1123NonRequired".equals(fieldName)) {
        DateTimeRfc1123 rfc1123NonRequiredHolder
            = reader.getNullable(nonNullReader -> new DateTimeRfc1123(nonNullReader.getString()));
        if (rfc1123NonRequiredHolder != null) {
            rfc1123NonRequired = rfc1123NonRequiredHolder.getDateTime();
        }
    }
    TransformationAsParentRequiredFields deserializedTransformationAsParentRequiredFields
        = new TransformationAsParentRequiredFields();
    // WRONG. setter requires wireType `DateTimeRfc1123`, here `OffsetDateTime` is passed in
    deserializedTransformationAsParentRequiredFields.setRfc1123NonRequired(rfc1123NonRequired);
  }