Bev*_*vor 5 java mapping modelmapper
我将业务对象映射到实体,并且在某些情况下实体的结构与业务对象不同。
我将userCategories它们作为字符串存储在业务对象中RecipeBo,因为 BO 不需要了解有关实体的内部结构的任何信息。这些字符串需要映射到Recipe和的关系RecipeUserCategoryRel,除此之外,另一个字段userId也RecipeBo需要映射到其中RecipeUserCategoryRel。
我的方法(有效)是创建一个包装器并手动创建关系,但这看起来像是修补:
public class BoMapper
{
private final static ModelMapper modelMapper = new ModelMapper();
static
{
modelMapper.addMappings(new IngredientMap());
}
public static void map(Object from, Object to)
{
modelMapper.map(from, to);
if (from instanceof RecipeBo && to instanceof Recipe)
{
RecipeBo recipeBo = (RecipeBo)from;
List<String> userCategories = recipeBo.getUserCategories();
List<RecipeUserCategoryRel> recipeUserCategoryRels = new ArrayList<>();
for (String userCategory : userCategories)
{
recipeUserCategoryRels.add(new RecipeUserCategoryRel(userCategory, recipeBo.getUserId()));
}
Recipe recipe = (Recipe)to;
recipe.setRecipeUserCategoryRels(recipeUserCategoryRels);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在 BoMapper 中所做的事情是否有更好的方法,例如使用转换器或其他东西?困难在于映射列表的每个元素并添加字段userId。
这是一个复杂的情况,因为您是从其他层次结构而不是直接从列表获取 userId。ModelMapper 会将 List 映射到 List,但如果您不将 ModelMapper 配置为 LOOSE,它将无法工作。
modelMapper.getConfiguration()
.setMatchingStrategy(MatchingStrategies.LOOSE);
Run Code Online (Sandbox Code Playgroud)
无论如何,如果您以这种方式配置 ModelMapper(松散模式),它将映射列表并放入类 RecipeUserCategoryRel 的 String 属性(在本例中,例如 userCategory,如果它是字符串,并且考虑到 userId 不是字符串) (我不太确定)我认为它会是空的。
好吧,我认为解决您问题的方法是创建一个 Converter 并将其添加到您的 ModelMapper 实例中:
代码如下:
ModelMapper mapper = new ModelMapper();
Converter<RecipeBO, Recipe> converter = new Converter<RecipeBO,
Recipe>() {
@Override
public Recipe convert(MappingContext<RecipeBO, Recipe> context) {
RecipeBO source = context.getSource();
Recipe destination = new Recipe();
List<String> userCategoryValues = source.getUserCategories();
List<RecipeUserCategoryRel> userCategoryToMap = new ArrayList<RecipeUserCategoryRel>();
for(final String userCategory : userCategoryValues){
userCategoryToMap.add(new RecipeUserCategoryRel(userCategory,source.getUserId()));
}
destination.setRecipeUserCategoryRels(userCategoryToMap);
//... Map other properties if you need
return destination;
}
};
//Option 1
mapper.createTypeMap(RecipeBO.class, Recipe.class).setConverter(converter);
//If you add as a converter directly also works (I don't know which one is better,
//choose above option (createTypeMap + setConverter) or the next (addConverter)
//Option 2 -> mapper.addConverter(converter);
Run Code Online (Sandbox Code Playgroud)
我已经测试过了,它有效!
如果我有如下食谱:
RecipeBO recipe = new RecipeBO();
recipe.setUserId("1");
String values[] = new String[] { "abc", "klm", "xyz", "pqr" };
List<String> list = Arrays.asList(values);
recipe.setUserCategories(list);
Run Code Online (Sandbox Code Playgroud)
还有食谱BO:
Recipe recipe = new Recipe();
List<RecipeUserCategoryRel> recipes = new ArrayList<>();
recipes.add(new RecipeUserCategoryRel("abc", "1"));
recipes.add(new RecipeUserCategoryRel("klm", "1"));
recipes.add(new RecipeUserCategoryRel("xyz", "1"));
recipes.add(new RecipeUserCategoryRel("pqr", "1"));
recipe.setRecipeUserCategoryRels(recipes);
Run Code Online (Sandbox Code Playgroud)
当我将 RecipeBO 映射到 Recipe 时:
Recipe actual = mapper.map(getRecipeBO(), Recipe.class);
Run Code Online (Sandbox Code Playgroud)
我得到下一个输出:
输出:
- RecipeUserCategoryRel(userCategory=abc, userId=1)
- RecipeUserCategoryRel(userCategory=klm, userId=1)
- RecipeUserCategoryRel(userCategory=xyz, userId=1)
- RecipeUserCategoryRel(userCategory=pqr, userId=1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8213 次 |
| 最近记录: |