【问题标题】:how to map processor to dto如何将处理器映射到 dto
【发布时间】:2020-11-30 18:32:18
【问题描述】:

我正在构建一个 MealPlanner 应用程序,它根据用户偏好构建膳食菜单,我需要一些指导来设置 DTO 中的 2 个字段(字段名称:preferenceType、resultState)。

实体结构(命名为 Meal):

class Meal {
    String itemName; //Such as Pizza, Sandwich
    double portion; //such as 1.5
    double cost; //such as 15.5, default currency is dollars
}

DTO 的结构:

class MealDTO {

    //Identical to Meal
    String itemName;
    double portion;
    double cost;

    //Additional fields in DTO
    String preferenceType; //FAT FREE, DAIRY FREE, VEGETARIAN
    String resultState; //OPTIMAL, FEASIBLE, INFEASIBLE
}

在两个类之间映射值的类:

public class FieldsMapper {

    // MealDTO -> Meal
    public Meal MealDtoToMeal(MealDTO mealDto) {
        Meal meal = new Meal();
        meal.setItemName(mealDto.getItemName());
        return meal;
    }

    //Meal -> MealDTO
    public MealDTO MealToMealDto(Meal meal) {
        MealDTO mealDto = new MealDTO();
        mealDto.setItemName(meal.getItemName());
        mealDto.setPortion(meal.getPortion());
        mealDto.setCost(meal.getCost());
        return mealDto;
    }
}

Please click here: MealPlanner full flow

这样,preferenceType 和 cost 的值就会丢失。 如何将preferenceType、resultState 映射到DTO?

(注意:膳食计划流程作为步骤

  1. 将用户请求(仅包含 itemName)映射到 MealDTO(除 itemName 之外的其他字段为空)。
  2. 使用 FieldsMapper 将 MealDTO 映射到 Meal。
  3. 将膳食传递给第三方,黑盒逻辑。此逻辑将返回一个结构为 {, , , }
  4. 的地图
  5. 部分和成本映射到膳食实体字段部分成本。
  6. 将 Meal 映射到 MealDTO 并返回 DTO 对象。)

【问题讨论】:

  • 如果您的Meal 中的portion 将具有十进制值,则它不应该是int 数据类型。请考虑更正。
  • 您没有向我们展示您如何使用 MapStruct,我们不知道您如何真正映射这两个对象,请考虑添加更多代码
  • @hocikto,Mapstruct 使用 getter 和 setter 来映射字段。为避免任何混淆,我将其替换为自定义类 FieldsMapper。问题和图表已更新。
  • 看起来很简单.. 确保保存黑盒中的值的对象确实设置在那里(通过调试或简单地将对象打印到控制台),然后检查你所在的变量调用 mapper.MealToMealDto(meal) 也许你把它分配错了..你能告诉我们你调用映射器的代码吗?

标签: java mapping entity dto


【解决方案1】:

首先,我认为您应该为 resultState 和 preferenceType 字段使用枚举而不是 String,因为它们具有固定值。

我认为您应该做的是创建另一个 DTO,其中包含 MealDTO 以及 resultState 和 preferenceType 字段,例如 UserMealDTO。所以像:

class UserMealDTO {
    MealDTO meal;
    MealPreference preferenceType;
    ResultState resultState; 
}

// Enums 

public enum MealPreference {
    FAT FREE, DAIRY FREE, VEGETARIAN;
}

public enum ResultState {
    OPTIMAL, FEASIBLE, INFEASIBLE;
}

【讨论】:

  • 谢谢@Amer,如何设置字段preferenceType、resultState? userMealDTO.setPreferenceType() 和 userMealDTO.setResultState() 是唯一的方法吗?有没有更优雅的方法来做到这一点?我正在从处理器类调用第三方 jar。
  • 是的,您需要使用 UserMealDTO 的设置器来设置值。我不确定你所说的优雅是什么意思。我的建议只是对您的膳食进行另一层抽象,以便为您提供所需的控制。
  • 当然,您可以为对象提供 2 个构造函数以提供更多控制,一个不带参数的私有构造函数,一个带有设置对象所需参数的公共构造函数,例如 public MealDto (String prefType, String resultState) { Objects.requireNonNull(prefType) } 或者另外检查字符串是否为空
  • 谢谢你 hockito,我认为构造函数是要走的路。
猜你喜欢
  • 2019-01-14
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
相关资源
最近更新 更多