работает над приложением 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 и внедрите в качестве методов "ничего не делать" методы, которые мне не нужны, но мне это кажется довольно беспорядочным.
О чем вы думаете? Может ли быть жизнеспособным решением или это ужасно, как ад? Существуют ли какие-то шаблоны или что-то вроде этого, которые решают мою проблему более аккуратно?