Что такое умное решение для обработки списка различных классов, реализующих интерфейс в этом приложении Spring Boot? - PullRequest
0 голосов
/ 19 марта 2020

работает над приложением Java Spring Boot. Я нахожу следующую проблему и не знаю, существует ли шаблон, который может решить мою проблему.

Я попытаюсь объяснить мою ситуацию в деталях и как я пытаюсь решить эту ситуацию (без конкретного результата на данный момент).

У меня есть этот класс DTO с именем ExcelTrendTabGeneralDTO :

public class ExcelTrendTabGeneralDTO {

    private String excelDocumentName;
    private String excelTabName;

    private List<ExcelTabInterface> tabTrendList;

    public ExcelTrendTabGeneralDTO() {
        super();
    }

    public ExcelTrendTabGeneralDTO(String excelDocumentName, String excelTabName,
            List<ExcelTabInterface> tabTrendList) {
        super();
        this.excelDocumentName = excelDocumentName;
        this.excelTabName = excelTabName;
        this.tabTrendList = tabTrendList;
    }

    .............................................................
    .............................................................
    .............................................................
    GETTER AND SETTER METHODS
    .............................................................
    .............................................................
    .............................................................
}

В этом классе В этом суть моей проблемы. Как вы видите, оно содержит это поле:

    private List<ExcelTabInterface> tabTrendList;

То, что на данный момент я определил как пустой интерфейс:

public interface ExcelTabInterface {

}

Это список ExcelTabInterface (это интерфейс, теперь я объясняю, почему и что я пытаюсь сделать). В начале вместо этого ExcelTabInterface у меня был конкретный c конкретный тип (класс), но я заменил его на интерфейс, потому что этот список мог содержать экземпляры объектов различного типа классов, реализующих этот интерфейс (это было моя идея).

Так, например, у меня был такой класс (названный CompVibrAndTempDTO ):

@Description(value = "DTO for the \"Vibration Monitore\" Excel tab")
public class CompVibrAndTempDTO extends ExcelTabAbstractDTO implements ExcelTabInterface {
    private String tempReadingPointA;
    private String tempReadingPointB;
    private String tempReadingPointC;

    ....................................................................
    ....................................................................
    ....................................................................
    CONSTRUCTOR AND GETTER AND SETTER METHODS
    ....................................................................
    ....................................................................
    ....................................................................
}

Хорошо ... идея, кажется, работает (я У меня нет синтаксической ошибки в моей IDE).

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

@Repository
public class ExcelRepositoryImpl implements ExcelRepository{

    @Autowired
     private JdbcTemplate jdbcTemplate;

    @Override
    //public List<CompVibrAndTempDTO> findCompVibrAndTempTab() {
    public List<ExcelTabInterface> findCompVibrAndTempTab() {

        String SELECT_COMP_VIBR_AND_TEMP_TAB = "SELECT * FROM TREND006";

        List<ExcelTabInterface> resultList = jdbcTemplate.query(SELECT_COMP_VIBR_AND_TEMP_TAB, new CompVibrAndTempMapper());

        return resultList;

    }

}

Итак, как вы можете видеть, я выполняю запрос SQL, ожидающий получения списка объектов, реализующих мой интерфейс ExcelTabInterface . Проблема в том, что для создания этих объектов я использую пользовательский класс сопоставления с именем CompVibrAndTempMapper , реализующий интерфейс Spring RowMapper .

Итак, это мой настраиваемый класс сопоставления:

public class CompVibrAndTempMapper implements RowMapper<ExcelTabInterface>{

    @Override
    public CompVibrAndTempDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
        ExcelTabInterface compVibrAndTempDto = new CompVibrAndTempDTO();

        SimpleDateFormat formatDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat formatDate = new SimpleDateFormat("dd/MM/yyyy");
        SimpleDateFormat formatTime = new SimpleDateFormat("HH:mm:ss");

        String dateStr = null;
        String timeStr = null;

        String dateFromDB = rs.getString("Time_Stamp");

        try {
            Date date = formatDateTime.parse(dateFromDB);
            dateStr = formatDate.format(date);
            timeStr = formatTime.format(date);      
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        compVibrAndTempDto.setDate(dateStr);
        compVibrAndTempDto.setTime(timeStr);
        compVibrAndTempDto.setTempReadingPointA(rs.getString("Sensor464DV"));
        compVibrAndTempDto.setTempReadingPointB(rs.getString("Sensor465DV"));
        compVibrAndTempDto.setTempReadingPointC(rs.getString("Sensor466DV"));
        ..........................................................................
        ..........................................................................
        ..........................................................................
        return compVibrAndTempDto;
    }

}

И вот у меня проблема. Проблема в том, что это дает мне ошибку в методах установки, потому что эти методы не определены в моем интерфейсе (то есть пусто).

Хорошо, я могу вставить эти методы установки для моего конкретного DTO, и я решаю эту ошибку !!! НО это частично сводит на нет мои усилия по обобщению моих классов DTO.

Поскольку у меня есть другие классы DTO, реализующие мой ExcelTabInterface интерфейс ->, поэтому я должен вставить также методы получения и установки этих другие классы DTO в мой интерфейс -> поэтому мне нужно объявить все методы каждого DTO во всех моих классах DTO, реализующих интерфейс ExcelTabInterface .

Теоретически я считаю, что решение может Реализуйте все методы, которые мне нужно объявить в интерфейсе ExcelTabInterface , во всех моих классах DTO и внедрите в качестве методов "ничего не делать" методы, которые мне не нужны, но мне это кажется довольно беспорядочным.

О чем вы думаете? Может ли быть жизнеспособным решением или это ужасно, как ад? Существуют ли какие-то шаблоны или что-то вроде этого, которые решают мою проблему более аккуратно?

1 Ответ

1 голос
/ 19 марта 2020

И почему вы определяете

ExcelTabInterface compVibrAndTempDto = new CompVibrAndTempDTO();

просто используйте

CompVibrAndTempDTO compVibrAndTempDto = new CompVibrAndTempDTO();

вам нужен конкретный класс здесь, и у вас есть один.

    new RowMapper<ExcelTabInterface>() {
        @Override
        public ExcelTabInterface mapRow(ResultSet rs, int rowNum) throws SQLException {
            CompVibrAndTempDTO compVibrAndTempDTO = new CompVibrAndTempDTO();
            compVibrAndTempDTO.setvalue("value");
            return compVibrAndTempDTO ;
        }
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...