Spring rest по умолчанию обеспечивает сборку функций pojo из переменных пути и параметров url.
В моем случае у меня есть pojo:
public class MyCriteria {
private String from;
private String till;
private Long communityNumber;
private String communityName;
}
, который используется в моем контроллере. URL-адрес http://localhost:8080/community/{communityNumber}/app
. Результат запроса
curl "http://localhost:8080/community/1/app?from=2018-11-14&till=2019-05-13&communityName=myCOm"
:
{
'from':'2018-11-14';
'till':'2019-05-12';
'communityNumber':'1';
'communityName':'myCOm'
}
Кажется, работает нормально. Гораздо лучше иметь в pojo данные с необходимыми типами по назначению. Поэтому я хотел бы иметь поля from
и till
типа LocalDate
. Используя пружину, я хотел бы получить это решение почти из коробки . Но никакие преобразователи даты Spring или Jackson не могут решить мою проблему из-за жизненного цикла.
Spring проверяет типы полей pojo перед введением дат, и я получаю исключение несоответствия типов. Я думаю, что основной причиной является использование специального компоновщика весной, который пытается найти необходимые параметры по имени, и он игнорирует аннотации, которые будут применены внутри pojo для полей.
Вопрос:
Есть ликакие-нибудь элегантные решения для создания pojo к весне, где некоторые поля будут преобразованы из String
в LocalDate
формат по умолчанию?
PS
Обязательные условия:
- Метод запроса
GET
; - Требуется Pojo:
public class MyCriteria {
private LocalDate from;
private LocalDate till;
private Long communityNumber;
private String communityName;
}
- позволяет пропустить идеи с пользовательскими реализациями AOP или с
getter
s, где вводится конвертироватьлогика; - нет ни тела (тело запроса пусто), ни json (все необходимые данные являются переменными пути или параметрами пути).
PS2.
- Пример контроллера, который можно использовать для экспериментов:
import lombok.extern.slf4j.Slf4j;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import org.vl.example.rest.dtofromoaramsandpath.web.dto.MyCriteria;
import java.time.LocalDate;
@RestController
@RequestMapping("verify/criteria/mapping")
@Slf4j
public class MyController {
@GetMapping("community/{communityNumber}/dto")
public MyCriteria loadDataByDto(MyCriteria criteria) {
log.info("received criteria: {}", criteria);
return criteria;
}
@GetMapping("community/{communityNumber}/default/params")
public String loadDataByDefaultParameters(@PathVariable("communityNumber") String communityNumber,
@RequestParam(value = "from", required = false) String from,
@RequestParam(value = "till", required = false) String till,
@RequestParam(value = "communityName", required = false) String communityName) {
log.info("received data without converting:\n\tcommunityNumber => {}\n\tfrom => {}\n\ttill => {}\n\tcommunityName => {}",
communityNumber, from, till, communityName);
return new StringBuilder("{")
.append("\n\tfrom:").append(from).append(";")
.append("\n\tfrom:").append(from).append(";")
.append("\n\ttill:").append(till).append(";")
.append("\n\tcommunityName:").append(communityName)
.append("\n}\n").toString();
}
@GetMapping("community/{communityNumber}/converted/params")
public String loadUsingConvertedParameters(@PathVariable("communityNumber") String communityNumber,
@RequestParam(value = "from") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate from,
@RequestParam("till") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate till,
@RequestParam(value = "communityName", required = false) String communityName) {
log.info("received data with LocalDate converting:\n\tcommunityNumber => {}\n\tfrom => {}\n\ttill => {}\n\tcommunityName => {}",
communityNumber, from, till, communityName);
return new StringBuilder("{")
.append("\n\tfrom:").append(from).append(";")
.append("\n\tfrom:").append(from).append(";")
.append("\n\ttill:").append(till).append(";")
.append("\n\tcommunityName:").append(communityName)
.append("\n}\n").toString();
}
}
- также ссылка на проект github , которая содержит модуль с необходимыми
controller
и criteria
сделать ваше понимание и экспериментыболее полезно.