Совместное использование общих переменных в классах Java - PullRequest
0 голосов
/ 02 ноября 2019

Следующий вопрос может быть слишком наивным, но, пожалуйста, помогите мне найти решение этой проблемы.

Я работаю над API Java RESTful, куда я отправляю формат ответа в формате JSON. Поскольку необходимо разработать несколько API, я подумал о том, чтобы сохранить некоторые общие переменные в абстрактных классах и использовать их везде, где это возможно. Ниже приведены 2 абстрактных класса, которые я разработал.

public @Data abstract class AbstractEntityWebServResDTO<D> {

    // Attributes
    //////////////
    protected Date createdDt;
    protected String createdBy;
    protected Date updatedDt;
    protected String updatedBy;

}
public @Data abstract class AbstractModifyWebServReqDTO<D> {

    // Attributes
    //////////////
    protected boolean delete;
    protected boolean modify;

}

Некоторые примеры ответных DTO.

public @Data class ResponseFormat1 extends AbstractEntityWebServResDTO<ResponseFormat1>{

    protected String response1Data;

}

Это приведет к JSON:

{
  "response1Data": "SOME DATA",
  "createdDt": "2019-11-02 23:33:23",
  "createdBy": "USERID",
  "updatedDt": "2019-11-02 23:33:23",
  "updatedBy": "USERID"
}

ДругойПример ответа DTO

public @Data class ResponseFormat2 extends AbstractModifyWebServReqDTO<ResponseFormat2>{

    protected String response2Data;

}

Это приведет к JSON:

{
  "response2Data": "SOME DATA",
  "delete": true,
  "modify": false
}

Как показано выше, классы расширяют различные классы Abstract, которые имеют к ним отношение. Но в некоторых случаях мне потребуется использовать все переменные, присутствующие в обоих абстрактных классах. Поскольку мы не можем расширить 2 абстрактных класса, как я могу этого достичь?

Решения, о которых я думал:

  • Создание единого абстрактного класса со всеми переменными и его использование. Но так как я использую FasterXML для преобразования DTO в формат JSON. Это приведет все нежелательные переменные в формате ответа.
  • Расширение Abstract с другим классом Abstract. Расширяющий класс будет производить тот же формат JSON с нежелательными переменными в нем.
  • Создание интерфейсов с переменными - но переменные внутри интерфейсов должны быть статическими или конечными.

Помогите, пожалуйста, выделить какое-либо доступное решение, чтобы избежать отправки нежелательных ключей в JSON?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Если вам нужны свойства из обоих классов abstract, используйте композицию и аннотацию com.fasterxml.jackson.annotation.JsonUnwrapped.

class ResponseFormatAll {
    @JsonUnwrapped
    private AbstractEntityWebServResDTO res;

    @JsonUnwrapped
    private AbstractModifyWebServReqDTO req;
}

С этого момента все ответы из двух абстрактных классов появляются в вашем ответе.

0 голосов
/ 02 ноября 2019

используйте композицию вместо наследования

пример:

public class CreateInfo {

          protected String updatedDt;
          protected String updatedBy;
}



public class UpdateInfo {

          protected Date updatedDt;
          protected String updatedBy;
}


public class FinalModel {

          protected CreateInfo createInfo;
          protected UpdateInfo updateInfo;
}

таким образом ваши модели гораздо более гибки, чем наследование, в большинстве случаев использование наследования не является хорошей практикой.

...