Получить производное DTO от DTO тела запроса базового класса - PullRequest
1 голос
/ 14 марта 2019

Я пытаюсь получить производные поля класса из тела ответа метода.Параметр тела запроса является типом базового класса.Запрос приходит с полями производного класса, но я не могу привести его к производному классу.

Вот мой метод контроллера и классы DTO:

Метод:

 @PostMapping("/{code}")
    public ResponseEntity<PromotionDto> createPromotion(@PathVariable String code, @RequestBody PromotionDto promotion){
        if(PromotionTypeEnum.ORDER_THRESHOLD_DISCOUNT.equals(promotion.getPromotionType())) {
            promotionService.createPromotion(orderThresholdDiscountPromotionConverter.toEntity((OrderThresholdDiscountPromotionDto)promotion));
        }
        return ResponseEntity.ok(promotion);
    }

Baseкласс DTO:

import dto.base.BaseDto;
import promotionservice.PromotionTypeEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PromotionDto extends BaseDto {
    private String code;
    private String title;
    private String description;
    private PromotionTypeEnum promotionType;

}

Производный класс DTO:

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class OrderThresholdDiscountPromotionDto extends PromotionDto {
    private Double thresholdTotal;
    private Double discountPrice;
    private String messageFired;
    private String messageCouldHaveFired;
}

Запрос JSON:

{
    "code":"qwewe",
    "title":"qwewe",
    "description":"qwewe",
    "promotionType":"ORDER_THRESHOLD_DISCOUNT",
    "thresholdTotal":1.3,
    "discountPrice":"12.5",
    "messageFired":"qwewe",
    "messageCouldHaveFired":"qwewe"

}

, как результат, сервис возвращает ошибку:

{
"type": "https://www.jhipster.tech/problem/problem-with-message",
"title": "Internal Server Error",
"status": 500,
"detail": "promotion.PromotionDto cannot be cast to promotion.OrderThresholdDiscountPromotionDto",
"path": "/api/promotionresults/qwewe",
"message": "error.http.500"

}

Мой вопрос: есть ли способ, библиотека, аннотация и т. Д. Для получения экземпляра производного класса из запроса?

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Использовать функцию наследования Джексона . Аннотируйте PromotionDto класс, как показано ниже:

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "promotionType")
@JsonSubTypes({
    @Type(value = OrderThresholdDiscountPromotionDto.class, name = "ORDER_THRESHOLD_DISCOUNT"),
})
class PromotionDto {

и удалите:

private PromotionTypeEnum promotionType;

недвижимость. Он будет обработан автоматически Jackson. В контроллере вы сможете использовать instanceof.

0 голосов
/ 14 марта 2019

То, что вы пытаетесь сделать, - это пытаться вписать Родителя в ребенка, известного как Даункинг . Это действительно только тогда, когда у вас есть Parent как экземпляр child. В вашем случае PromotionDto должно быть экземпляром OrderThresholdDiscountPromotionDto .

Пожалуйста, обратитесь ниже пример:

public class PromotionDto  {
    private String code;
    private String title;
    private String description;




    public static void main(String[] args) {

      PromotionDto promotionDto = new OrderThresholdDiscountPromotionDto();
      PromotionDto promotionDto_2 = new PromotionDto();

    //Valid downcasting
      OrderThresholdDiscountPromotionDto subClass1 = (OrderThresholdDiscountPromotionDto)promotionDto;

      //Invalid down casting
      OrderThresholdDiscountPromotionDto subClass2 = (OrderThresholdDiscountPromotionDto)promotionDto_2;

    }


}

class OrderThresholdDiscountPromotionDto extends PromotionDto {
  private Double thresholdTotal;
  private Double discountPrice;
  private String messageFired;
  private String messageCouldHaveFired;

}
...