Получение указанных данных из модели в виде ответа JSON с аннотациями - PullRequest
0 голосов
/ 03 декабря 2018

Я хотел бы получить ответ JSON с некоторыми аннотациями.Например, теперь мой ответ в json выглядит следующим образом:

{
"id": 1,
"startDate": [
    1993,
    12,
    12
],
"endDate": [
    2018,
    11,
    22
],
"totalDistance": 255,
"totalPrice": 211
}

Но я хочу получить выбранные данные из моей модели и добавить к ним аннотации, например, единицы измерения или изменить формат типа даты.Это то, что я хочу получить в качестве ответа json:

{
"startDate": "December, 12th",
"totalDistance": "255 km",
"totalPrice": "211 Euros",
}

Это часть моего ApiController:

 @RequestMapping(path = "/api/reports/daily", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE, produces = "application/json")
public Reports getDailyReport1(@RequestParam("start_date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate  , @RequestParam("end_date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate) {
    Reports reports = new Reports();
    reports.setStartDate(startDate);
    reports.setEndDate(endDate);
    reportsService.calculateTotalDistance(reports);
    reportsService.calculateTotalPrice(reports);
    return reports;
}

@GetMapping(value = "/api/reports/{id}", produces = "application/json")
public Optional<Reports> getReportsFromId(@PathVariable Long id){
    return reportsService.getReport(id);
}

@GetMapping("/api/reports")
public Collection<Reports> getAllReports(){
    return reportsService.findAllReports();
}

Служба:

@Service
public class ReportsService {

@Autowired
TransitService transitService;

@Autowired
ReportsRepository reportsRepository;


public void addReports(Reports reports) {
    reportsRepository.save(reports);
}


public void calculateTotalDistance(Reports reports) {
    double totalDistance = 0.0;
    List<Transit> transits = transitService.getTransits(reports.getStartDate(), reports.getEndDate());
    for (Transit transit : transits) {
        if (transit.getDistance() != null) {
            totalDistance = totalDistance + transit.getDistance();
        }
    }
    reports.setTotalDistance((long) totalDistance);
}


public void calculateTotalPrice(Reports reports) {
    double totalPrice = 0.0;
    List<Transit> transits = transitService.getTransits(reports.getStartDate(), reports.getEndDate());
    for (Transit transit : transits) {
        if (transit.getPrice() != null) {
            totalPrice = totalPrice + transit.getPrice();
        }
    }
    reports.setTotalPrice((long) totalPrice);
}

public void addReports1(Reports reports) {
    reportsRepository.save(reports);
}



public List<Reports> findAllReports() {
    Iterable<Reports> all = reportsRepository.findAll();
    List<Reports> reports = convertReportsToList(all);
    return reports;
}

private List<Reports> convertReportsToList(Iterable<Reports> all) {
    List<Reports> reports = new ArrayList<>();
    for (Reports report : all) {
        reports.add(report);
    }
    return reports;
}

public Optional<Reports> getReport(Long id){
    return reportsRepository.findById(id);
}

}

Когда яизмените @RequestMapping (путь = "/ api / reports / daily") на:

@RequestMapping(path = "/api/reports/daily", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE, produces = "application/json")
public String getDailyReport1(@RequestParam("start_date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate  , @RequestParam("end_date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate) {
    Reports reports = new Reports();
    reports.setStartDate(startDate);
    reports.setEndDate(endDate);
    reportsService.calculateTotalDistance(reports);
    reportsService.calculateTotalPrice(reports);
    return "Total price" + reports.getTotalPrice + "Euros" + "Total distance" + reports.getTotalDistance + "km";

Я получаю ответ от JSON.Должен ли J создать шаблон ответа json и вернуть его сюда, чтобы получить информацию, которую я хочу, с аннотациями, такими как единицы измерения и т. Д. ??Спасибо за ваше время.Надеюсь, вы понимаете, что у меня на уме.

1 Ответ

0 голосов
/ 04 декабря 2018

Предполагая, что вы используете Джексона, вы можете добавить настраиваемый сериализатор для форматирования так, как вам нужно.

например, создать DistanceSerializer

public class DistanceSerializer<T> extends StdSerializer<T> {

    public DistanceSerializer() {
        this(null);
    }

    protected DistanceSerializer(Class<T> t) {
        super(t);
    }

    @Override
    public void serialize(T value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeString(value + " km");
    }

}

и аннотировать поле totalDistance с помощью DistanceSerializer

    @JsonSerialize(using=DistanceSerializer.class)
    private long totalDistance;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...