Отказ от ответственности: я действительно новичок в Java, и я пытаюсь преобразовать этот json в springboot, используя потоки, чтобы получить вывод, как указано ниже. Но все мои испытания терпят неудачу, что я делаю не так с этим.
[
{
"id": 1,
"year": 2020,
"description": "Two thousand twenty",
"brands": [
{
"id": 1,
"name": "Tesla",
"description": "This is a car provider from USA",
"countryId": 16,
"brandNo": "TE001",
"categoryId": 23
},
{
"id": 2,
"name": "Toyota",
"description": "This is a car provider from Japan",
"countryId": 16,
"brandNo": "TE003",
"categoryId": 23
}
]
},
{
"id": 1,
"year": 2022,
"description": "Two thousand twenty",
"brands": [
{
"id": 1,
"name": "Tesla",
"description": "This is a car provider from USA",
"countryId": 16,
"brandNo": "TE001",
"categoryId": 23
},
{
"id": 2,
"name": "Toyota",
"description": "This is a car provider from Japan",
"countryId": 16,
"brandNo": "TE003",
"categoryId": 23
}
]
}
]
Вывод, который я хочу получить, основан на том, если пользователь передает имя бренда, который "Toyota"
, тогда вывод должен быть.
[
{
"id": 1,
"year": 2020,
"description": "Two thousand twenty",
"brands": [
{
"id": 2,
"name": "Toyota",
"description": "This is a car provider from Japan",
"countryId": 16,
"brandNo": "TE003",
"categoryId": 23
}
]
},
{
"id": 1,
"year": 2022,
"description": "Two thousand twenty",
"brands": [
{
"id": 2,
"name": "Toyota",
"description": "This is a car provider from Japan",
"countryId": 16,
"brandNo": "TE003",
"categoryId": 23
}
]
}
]
Мой текущий фрагмент кода, который я использую, выглядит так, как показано ниже. Любая помощь высоко ценится.
List<YearBrandDTO> years = yearRepository.findAll().stream()
.map(year -> year.getBrands().stream()
.filter(brand -> brand.getName().equals("Toyota")))
.map(year -> modelMapper.map(year, YearBrandDTO.class))
.collect(Collectors.toList());
И мой DTO выглядит так
@Data
public class YearBrandDTO {
private Long id;
private Integer year;
private String description;
private Object brands;
}
Но на выходе я получаю нулевые значения
[
{
"id": null,
"year": null,
"description": null,
"brands": null
}
]
Вы пытаетесь сопоставить результат фильтрации брендов непосредственно с YearBrandDTO
. Но вы должны сначала отфильтровать бренды, а затем создать новый объект YearBrandDTO
.
Так:
List<YearBrandDTO> years = yearRepository.findAll().stream()
.map(year -> {
List<Brand> filteredBrands = year.getBrands().stream()
.filter(brand -> brand.getName().equals("Toyota"))
.collect(Collectors.toList());
YearBrandDTO yearBrandDTO = modelMapper.map(year, YearBrandDTO.class);
yearBrandDTO.setBrands(filteredBrands);
return yearBrandDTO;
})
.collect(Collectors.toList());
Таким образом, вы сможете получить желаемый результат. Просто обновите свой класс YearBrandDTO
, чтобы он имел List<BrandDTO>
вместо объекта для поля бренда.
@Data
public class YearBrandDTO {
private Long id;
private Integer year;
private String description;
private List<BrandDTO> brands;
}
В вашем случае мне нужно было бы создать класс BrandDTO
, аналогичный вашему классу YearBrandDTO
, чтобы сопоставить поля бренда.
Спасибо @devblack.exe, мне удалось решить проблему, поскольку предыдущий комментарий о преобразовании BrandEntity в BrandDTO работал хорошо, теперь проблема заключалась в том, как я отправлял свой RequestParam
, он был заключен в кавычки, которые Java рассматривал совершенно другую строку. После удаления кавычек мне удалось получить нужные данные.
Спасибо, @devblack.exe, я реализовал то, чем вы поделились, хотя столкнулся с другой проблемой. В этой строке он жаловался
yearBrandDTO.setBrands(finalBrands);
, что ожидал данные типаList<BrandDTO>
, но предоставилList<BrandEntity>
, затем я сделал еще один потокList<BrandDTO> finalBrands = filteredBrands.stream().map(brand -> modelMapper.map(brand, BrandDTO.class)).collect(Collectors.toList());
, чтобы получить List<BrandDTO>`, но теперь мой ответ возвращает[{"id": 1, "year": 2020, "description": "Two thousand twenty", "brands": []}]
, я не знаю, что я делаю неправильно .