代码之家  ›  专栏  ›  技术社区  ›  Mateusz Gebroski

MapStruct Java流

  •  0
  • Mateusz Gebroski  · 技术社区  · 7 年前

    我的问题是,我真的不知道如何返回转换的父值和转换字段在这个实体。

    public class RecipeDTO {
    
    
        private Integer id;
    
        private String title;
    
        private String description;
    
        private String imgUrl;
    
        private String directions;
    
        private String prepTime;
    
        private Integer servings;
    
        private String category;
    
        private Set<IngredientDTO> ingredientDTOSet = new HashSet<>();
    }
    

    实体

    public class Recipe {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "recipe_id")
        private Integer id;
    
        @NotNull
        @Column(name = "recipe_title")
        private String title;
    
        @NotNull
        @Column(name = "recipe_description")
        private String description;
    
        @Column(name = "recipe_img_url")
        private String imgUrl;
    
        @NotNull
        @Column(name = "recipe_direction")
        private String directions;
    
        @NotNull
        @Column(name = "prep_time")
        private String prepTime;
    
        @NotNull
        @Column(name = "servings")
        private Integer servings;
    
        @NotNull
        @Column(name = "category")
        private String category;
    
        @OneToMany(mappedBy = "recipe",
                cascade = CascadeType.ALL)
        private Set<Ingredient> ingredients = new HashSet<>();
    
    }
    

    @Override
        public List<RecipeDTO> findAll() {
    
            log.debug("\n" + this.getClass().getSimpleName() + " -> findAll() \n");
    
            return recipeRepository.findAll()
                    .stream()
                    .map(recipe -> RecipeMapper.INSTANCE.recipeToRecipeDTO(recipe))
                    .collect(Collectors.toList());
        }
    
    
    @Mapper(componentModel = "spring", uses = {IngredientMapper.class})
    public interface RecipeMapper {
    
        RecipeMapper INSTANCE = Mappers.getMapper(RecipeMapper.class);
    
        @Mappings({
                @Mapping(source = "ingredients", target = "ingredientDTOSet")
        })
        RecipeDTO recipeToRecipeDTO(Recipe recipe);
    
    
    }
    

    如何转换嵌套bean? 当我试图得到所有食谱异常抛出

    在com.mateuszgeborski.recipeappapi.api.mapper.RecipeMapperImpl.ingredientsetToingredientdoset(RecipeMapperImpl。java:52)~[类/:na] 在com.mateuszgeborski.recipeappapi.api.mapper.RecipeMapperImpl.recipeToRecipeDTO(RecipeMapperImpl。java:32)~[类/:na] 在java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline。java:193)~[na:1.8.0µ] 在java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList。java:1382)~[na:1.8.0µ] 在java.util.stream.AbstractPipeline.copyInto(AbstractPipeline。java:481)~[na:1.8.0µ]

    看起来是有配料的,但当我在用配方而不是DTO时,一切都很好。。

    3 回复  |  直到 7 年前
        1
  •  0
  •   Filip    7 年前

    componentModel = "spring" Mappers 工厂。当您使用spring组件模型时,所使用的映射器在生成的类和 映射器

        2
  •  1
  •   nikmaster    7 年前

    您可以使用流的映射功能

    List<Recipe> list = ... //however you get your original list
    List<RecipeDTO> dtos = list.stream().map(mapper::convert).collect(Collectors.toList);
    

    我假设你的mapstruct方法叫做“convert”,mapper的变量叫做“mapper”


    列表的映射将为流中的每个条目调用给定的方法(mapper::convert),然后流将包含此方法的所有调用的所有返回值。所以在您的例子中:它将转换列表中的每个条目,然后列表将包含所有转换的元素

    之后,您只需要再次收集流,这样您就又有了一个列表


    编辑后,此答案不再有效,因为您已更改了问题并使用了我的答案。

    对于您的后续问题: 一般来说,要转换嵌套bean:只要嵌套bean的结构相同,mapstruct就会开箱即用。如果你有不同之处,你必须对它们进行注释。如果没有看到您的代码的这一部分,我无法告诉您Ingrediant和IngRediantTo之间的区别。

    对于嵌套bean:

        3
  •  0
  •   Mrinal    7 年前

    这不是关于java流的问题。Java流api正在调用 recipeToRecipeDTO 应该能够将整个配方对象转换为RecipeDTO。

    要解决这个问题,您需要在中添加一个方法 RecipeMapper Ingredient 实体对象到 IngredientDTO