Проблема ModelMapper с отображением основных POJOS - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть 2 основных POJO, которые я использую для создания объекта json:

public class ProductCreateRequestModel {
    private String name;
    private double price;
    private int qty;
    private String imgPath;

    private CategoryRequestCreateProductModel category;
}

public class CategoryRequestCreateProductModel {
    private String name;
    private String categoryKeyId;
}

В основном это позволяет мне использовать простой json, подобный этому:

{
    "name": "Pizza,
    "price": 344.0,
    "qty": 15,
    "imgPath": "new/pathImage",
    "category": {
        "categoryKeyId": "23ume70Fu6yqyGUWfQkW110P4ko3gZ",
        "name": "Starter"
    }
}

Я хочучтобы отправить этот JSON и сохранить данные, и я ожидаю получить объект, который я собираю с помощью этого POJO:

public class ProductRest {

    private String productKeyId;
    private String name;
    private double price;
    private int qty;
    private String imgPath;

    private CategoryRest category;
}

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

@PostMapping(
        consumes = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE },
        produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE }
)
public ProductRest createProduct(@RequestBody ProductCreateRequestModel productCreateRequestModel) throws Exception {
    ProductRest returnValue = new ProductRest();
    if(productCreateRequestModel.getName().isEmpty() || productCreateRequestModel.getPrice() <= 0)
        throw new ApplicationServiceException(ErrorMessages.MISSING_REQUIRED_FIELDS.getErrorMessage());

    ModelMapper modelMapper = new ModelMapper();
    ProductDto productDto = modelMapper.map(productCreateRequestModel, ProductDto.class);

    ProductDto createdProduct = productService.createProduct(productDto);
    returnValue = modelMapper.map(createdProduct, ProductRest.class);

    return returnValue;
}

Мой сервисный уровень на самом деле ничего особенного не делает:

@Override
public ProductDto createProduct(ProductDto productDto) {
    return productDto;
}

Мой DTO-слой содержит следующие поля:

@Getter @Setter
public class ProductDto implements Serializable {
    // ommit this member and do not generate getter / setter
    @Getter(AccessLevel.NONE)
    @Setter(AccessLevel.NONE)
    private static final long serialVersionUID = 1L;

    private Long id;
    private String productKeyId;
    private String name;
    private double price;
    private int availableQty;
    private String imgPath;

    private CategoryDto category = new CategoryDto();
}


@Getter @Setter
public class CategoryDto implements Serializable {
    @Getter(AccessLevel.NONE)
    @Setter(AccessLevel.NONE)
    private static final long serialVersionUID = 1L;

    private long id;
    private String categoryKeyId;
    private String name;

    private CategoryDto parentCategory;
    private List<CategoryDto> subCategories;

    private String parentCategoryKeyId;

    private Long parentCategoryId;
}

При попытке запустить этот базовый код я получаю сообщение об ошибке:

java.lang.NumberFormatException: для входной строки: "23ume70Fu6yqyGUWfQkW110P4ko3gZ"

...