{"id":932,"date":"2022-05-19T20:35:47","date_gmt":"2022-05-19T12:35:47","guid":{"rendered":"https:\/\/blog.frost-s.com\/?p=932"},"modified":"2022-05-20T18:03:35","modified_gmt":"2022-05-20T10:03:35","slug":"932","status":"publish","type":"post","link":"https:\/\/blog.frost-s.com\/index.php\/2022\/05\/19\/932\/","title":{"rendered":"Mapstruct\u81ea\u5b9a\u4e49\u8f6c\u6362\u89c4\u5219"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\" id=\"anchor-1\"><a><\/a>\u4e00\u3001\u5b9a\u4e49\u8f6c\u6362\u89c4\u5219<\/h1>\n\n\n\n<pre class=\"wp-block-preformatted\">\u5b9a\u4e49\u7684\u7c7b\u4e0a\u8fb9\u589e\u52a0@Named\u6ce8\u89e3\u6807\u6ce8\u8f6c\u6362\u540d\u79f0<\/pre>\n\n\n\n<p><strong>\u5b9a\u4e49\u8f6c\u6362\u89c4\u5219<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import cn.hutool.core.util.StrUtil;\r\nimport com.alibaba.fastjson.JSON;\r\nimport org.mapstruct.Named;\r\nimport org.springframework.stereotype.Component;\r\n \r\nimport java.util.List;\r\nimport java.util.Objects;\r\n \r\n\/**\r\n * Mapping\u901a\u7528\u8f6c\u6362\r\n *\/\r\n@Component\r\npublic class TypeConversionWorker {\r\n    \/**\r\n     * \u5bf9\u8c61\u8f6cjson\u5b57\u7b26\u4e32\r\n     *\r\n     * @param obj\r\n     * @return\r\n     *\/\r\n    @Named(\"toJsonString\")\r\n    public String toJsonString(Object obj) {\r\n        if (Objects.isNull(obj)) {\r\n            return null;\r\n        }\r\n        return JSON.toJSONString(obj);\r\n    }\r\n    \/**\r\n     * json\u5b57\u7b26\u4e32\u8f6c\u5bf9\u8c61\r\n     *\r\n     * @param jsonStr\r\n     * @return\r\n     *\/\r\n    @Named(\"jsonStringToNameObject\")\r\n    public List&lt;Name> jsonStringToObject(String jsonStr) {\r\n        if (StrUtil.isEmpty(jsonStr)) {\r\n            return null;\r\n        }\r\n        List&lt;Name> names = JSON.parseArray(jsonStr, Name.class);\r\n        return names;\r\n    }\r\n    \/**\r\n     * json\u5b57\u7b26\u4e32\u8f6c\u5bf9\u8c61\r\n     *\r\n     * @param jsonStr\r\n     * @return\r\n     *\/\r\n    @Named(\"jsonStringToNameValueObject\")\r\n    public List&lt;NameValue> jsonStringToNameValueObject(String jsonStr) {\r\n        if (StrUtil.isEmpty(jsonStr)) {\r\n            return null;\r\n        }\r\n        List&lt;NameValue> names = JSON.parseArray(jsonStr, NameValue.class);\r\n        return names;\r\n    }\r\n    \/**\r\n     * json\u5b57\u7b26\u4e32\u8f6c\u5bf9\u8c61\r\n     *\r\n     * @param jsonStr\r\n     * @return\r\n     *\/\r\n    @Named(\"jsonStringToValueObject\")\r\n    public List&lt;Value> jsonStringToValueObject(String jsonStr) {\r\n        if (StrUtil.isEmpty(jsonStr)) {\r\n            return null;\r\n        }\r\n        List&lt;Value> names = JSON.parseArray(jsonStr, Value.class);\r\n        return names;\r\n    }\r\n}<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"anchor-2\"><a><\/a>\u4e8c\u3001\u4f7f\u7528\u8f6c\u6362\u89c4\u5219<\/h1>\n\n\n\n<p>\u4f7f\u7528@Mapper\u6ce8\u89e3<strong>uses<\/strong>\u5f15\u5165\u8f6c\u6362\u89c4\u5219\uff0ceg:<strong>uses = TypeConversionWorker.class<\/strong><\/p>\n\n\n\n<p>@Mapping\u4f7f\u7528<strong>qualifiedByName<\/strong>\u6807\u8bc6\u8f6c\u6362\u89c4\u5219\uff0ceg:<strong>qualifiedByName = \"toJsonString\"\u3002<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import org.mapstruct.Mapper;\nimport org.mapstruct.Mapping;\nimport org.mapstruct.factory.Mappers;\n \nimport java.util.List;\n \n@Mapper(uses = TypeConversionWorker.class)\npublic interface ShopConvert {\n \n    ShopConvert INSTANCE = Mappers.getMapper(ShopConvert.class);\n    @Mapping(target = \"serviceField\", source = \"serviceField\", qualifiedByName = \"jsonStringToNameObject\")\n    @Mapping(target = \"costField\", source = \"costField\", qualifiedByName = \"jsonStringToNameValueObject\")\n    @Mapping(target = \"examinationField\", source = \"examinationField\", qualifiedByName = \"jsonStringToValueObject\")\n    List&lt;ShopRespVO&gt; convertList(List&lt;ShopDO&gt; list);\n \n    List&lt;ShopSimpleRespVO&gt; convertList02(List&lt;ShopDO&gt; list);\n \n    @Mapping(target = \"serviceField\", source = \"serviceField\", qualifiedByName = \"jsonStringToNameObject\")\n    @Mapping(target = \"costField\", source = \"costField\", qualifiedByName = \"jsonStringToNameValueObject\")\n    @Mapping(target = \"examinationField\", source = \"examinationField\", qualifiedByName = \"jsonStringToValueObject\")\n    ShopRespVO convert(ShopDO bean);\n \n    @Mapping(target = \"serviceField\", source = \"serviceField\", qualifiedByName = \"toJsonString\")\n    @Mapping(target = \"costField\", source = \"costField\", qualifiedByName = \"toJsonString\")\n    @Mapping(target = \"examinationField\", source = \"examinationField\", qualifiedByName = \"toJsonString\")\n    ShopDO convert(ShopCreateReqVO bean);\n \n    @Mapping(target = \"serviceField\", source = \"serviceField\", qualifiedByName = \"toJsonString\")\n    @Mapping(target = \"costField\", source = \"costField\", qualifiedByName = \"toJsonString\")\n    @Mapping(target = \"examinationField\", source = \"examinationField\", qualifiedByName = \"toJsonString\")\n    ShopDO convert(ShopUpdateReqVO bean);\n \n \n}<\/code><\/pre>\n\n\n\n<p><strong>&nbsp;\u6d89\u53ca\u5230\u5b9e\u4f53(\u975e\u91cd\u70b9)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>import<\/strong> io.swagger.annotations.ApiModel;\n<strong>import<\/strong> io.swagger.annotations.ApiModelProperty;\n<strong>import<\/strong> lombok.Data;\n<strong>import<\/strong> lombok.EqualsAndHashCode;\n \n<strong>import<\/strong> java.util.Date;\n<strong>import<\/strong> java.util.List;\n \n@ApiModel(\"\u7ba1\u7406\u540e\u53f0 - \u5546\u54c1\u4fe1\u606f Response VO\")\n@Data\n@EqualsAndHashCode(callSuper = true)\npublic <strong>class<\/strong> <strong>ShopRespVO<\/strong> <strong>extends<\/strong> <strong>ShopBaseVO<\/strong> {\n \n    @ApiModelProperty(value = \"\u5546\u54c1\u7f16\u53f7\", required = true, example = \"1024\")\n    <strong>private<\/strong> Long id;\n \n \n    @ApiModelProperty(value = \"\u521b\u5efa\u65f6\u95f4\", required = true, example = \"\u65f6\u95f4\u6233\u683c\u5f0f\")\n    <strong>private<\/strong> Date createTime;\n \n    \/*\u5206\u7c7b\u540d\u79f0*\/\n    <strong>private<\/strong> String systemClassificationName;\n \n    \/*\u524d\u7aef\u56de\u586bID*\/\n    <strong>private<\/strong> List&lt;Long&gt; ids;\n \n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>import<\/strong> <strong>io<\/strong>.swagger.annotations.ApiModelProperty;\n<strong>import<\/strong> <strong>lombok<\/strong>.Data;\n<strong>import<\/strong> <strong>org<\/strong>.hibernate.validator.constraints.Length;\n \n<strong>import<\/strong> <strong>java<\/strong>.math.BigDecimal;\n<strong>import<\/strong> <strong>java<\/strong>.util.List;\n \n\/**\n * \u5546\u54c1 Base VO\uff0c\u63d0\u4f9b\u7ed9\u6dfb\u52a0\u3001\u4fee\u6539\u3001\u8be6\u7ec6\u7684\u5b50 VO \u4f7f\u7528\n * \u5982\u679c\u5b50 VO \u5b58\u5728\u5dee\u5f02\u7684\u5b57\u6bb5\uff0c\u8bf7\u4e0d\u8981\u6dfb\u52a0\u5230\u8fd9\u91cc\uff0c\u5f71\u54cd Swagger \u6587\u6863\u751f\u6210\n *\/\n@<strong>Data<\/strong>\n<strong>public<\/strong> <strong>class<\/strong> <strong>ShopBaseVO<\/strong> {\n \n    \/**\n     * \u5546\u54c1\u540d\u79f0\n     *\/\n    @ApiModelProperty(\"\u5546\u54c1\u540d\u79f0\")\n    @Length(max= 255,message=\"\u7f16\u7801\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc7255\")\n    private String name;\n    \/**\n     * \u5546\u54c1\u5206\u7c7b\n     *\/\n    @ApiModelProperty(\"\u5546\u54c1\u5206\u7c7b\")\n    private Long systemClassificationId;\n    \/**\n     * \u6807\u51c6\u4ef7\u683c\n     *\/\n    @ApiModelProperty(\"\u6807\u51c6\u4ef7\u683c\")\n    private BigDecimal price;\n    \/**\n     * \u6700\u4f4e\u4ef7\u683c\n     *\/\n    @ApiModelProperty(\"\u6700\u4f4e\u4ef7\u683c\")\n    private BigDecimal minPrice;\n    \/**\n     * \u5546\u54c1\u72b6\u6001\uff080\u6b63\u5e38 1\u505c\u7528\uff09\n     *\/\n    @ApiModelProperty(\"\u5546\u54c1\u72b6\u6001\uff080\u6b63\u5e38 1\u505c\u7528\uff09\")\n    private Byte status;\n    \/**\n     * \u670d\u52a1\u5b57\u6bb5\n     *\/\n    @ApiModelProperty(\"\u670d\u52a1\u5b57\u6bb5\")\n    private List&lt;Name&gt; serviceField;\n    \/**\n     * \u6210\u672c\u8d39\u7528\u6807\u51c6\n     *\/\n    @ApiModelProperty(\"\u6210\u672c\u8d39\u7528\u6807\u51c6\")\n    private List&lt;NameValue&gt; costField;\n    \/**\n     * \u8865\u5145\u62a5\u8003\u5b57\u6bb5\n     *\/\n    @ApiModelProperty(\"\u8865\u5145\u62a5\u8003\u5b57\u6bb5\")\n    private List&lt;Value&gt; examinationField;\n    \/**\n     * \u5907\u6ce8\n     *\/\n    @ApiModelProperty(\"\u5907\u6ce8\")\n    @Length(max= 255,message=\"\u5907\u6ce8\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc7255\")\n    private String remark;\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>import<\/strong> <strong>com<\/strong>.baomidou.mybatisplus.annotation.TableName;\n<strong>import<\/strong> <strong>io<\/strong>.swagger.annotations.ApiModelProperty;\n<strong>import<\/strong> <strong>lombok<\/strong>.Data;\n<strong>import<\/strong> <strong>lombok<\/strong>.EqualsAndHashCode;\n<strong>import<\/strong> <strong>org<\/strong>.hibernate.validator.constraints.Length;\n \n<strong>import<\/strong> <strong>java<\/strong>.math.BigDecimal;\n<strong>import<\/strong> <strong>java<\/strong>.util.Date;\n \n\/**\n* \u5546\u54c1\n* @TableName system_shop\n*\/\n@<strong>TableName<\/strong>(\"system_shop\")\n@<strong>Data<\/strong>\n@<strong>EqualsAndHashCode<\/strong>(callSuper = true)\n<strong>public<\/strong> <strong>class<\/strong> <strong>ShopDO<\/strong> <strong>extends<\/strong> <strong>TenantBaseDO<\/strong> {\n \n    \/**\n    * \u5546\u54c1ID\n    *\/\n    @ApiModelProperty(\"\u5546\u54c1ID\")\n    private Long id;\n    \/**\n    * \u5546\u54c1\u540d\u79f0\n    *\/\n    @ApiModelProperty(\"\u5546\u54c1\u540d\u79f0\")\n    @Length(max= 255,message=\"\u7f16\u7801\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc7255\")\n    private String name;\n    \/**\n    * \u5546\u54c1\u5206\u7c7b\n    *\/\n    @ApiModelProperty(\"\u5546\u54c1\u5206\u7c7b\")\n    private Long systemClassificationId;\n    \/**\n    * \u6807\u51c6\u4ef7\u683c\n    *\/\n    @ApiModelProperty(\"\u6807\u51c6\u4ef7\u683c\")\n    private BigDecimal price;\n    \/**\n    * \u6700\u4f4e\u4ef7\u683c\n    *\/\n    @ApiModelProperty(\"\u6700\u4f4e\u4ef7\u683c\")\n    private BigDecimal minPrice;\n    \/**\n    * \u5546\u54c1\u72b6\u6001\uff080\u6b63\u5e38 1\u505c\u7528\uff09\n    *\/\n    @ApiModelProperty(\"\u5546\u54c1\u72b6\u6001\uff080\u6b63\u5e38 1\u505c\u7528\uff09\")\n    private Byte status;\n    \/**\n    * \u670d\u52a1\u5b57\u6bb5\n    *\/\n    @ApiModelProperty(\"\u670d\u52a1\u5b57\u6bb5\")\n    private String serviceField;\n    \/**\n    * \u6210\u672c\u8d39\u7528\u6807\u51c6\n    *\/\n    @ApiModelProperty(\"\u6210\u672c\u8d39\u7528\u6807\u51c6\")\n    private String costField;\n    \/**\n    * \u8865\u5145\u62a5\u8003\u5b57\u6bb5\n    *\/\n    @ApiModelProperty(\"\u8865\u5145\u62a5\u8003\u5b57\u6bb5\")\n    private String examinationField;\n    \/**\n    * \u521b\u5efa\u8005\n    *\/\n    @ApiModelProperty(\"\u521b\u5efa\u8005\")\n    @Length(max= 64,message=\"\u7f16\u7801\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc764\")\n    private String creator;\n    \/**\n    * \u521b\u5efa\u65f6\u95f4\n    *\/\n    @ApiModelProperty(\"\u521b\u5efa\u65f6\u95f4\")\n    private Date createTime;\n    \/**\n    * \u66f4\u65b0\u8005\n    *\/\n    @ApiModelProperty(\"\u66f4\u65b0\u8005\")\n    @Length(max= 64,message=\"\u7f16\u7801\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc764\")\n    private String updater;\n    \/**\n    * \u66f4\u65b0\u65f6\u95f4\n    *\/\n    @ApiModelProperty(\"\u66f4\u65b0\u65f6\u95f4\")\n    private Date updateTime;\n    \/**\n    * \u662f\u5426\u5220\u9664\n    *\/\n    @ApiModelProperty(\"\u662f\u5426\u5220\u9664\")\n    private Boolean deleted;\n    \/**\n    * \u79df\u6237\u7f16\u53f7\n    *\/\n    @ApiModelProperty(\"\u79df\u6237\u7f16\u53f7\")\n    private Long tenantId;\n    \/**\n    * \u5907\u6ce8\n    *\/\n    @ApiModelProperty(\"\u5907\u6ce8\")\n    @Length(max= 255,message=\"\u7f16\u7801\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc7255\")\n    private String remark;\n \n \n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>import<\/strong> io.swagger.annotations.ApiModel;\n<strong>import<\/strong> io.swagger.annotations.ApiModelProperty;\n<strong>import<\/strong> lombok.Data;\n<strong>import<\/strong> lombok.EqualsAndHashCode;\n \n<strong>import<\/strong> javax.validation.constraints.NotNull;\n \n@ApiModel(\"\u7ba1\u7406\u540e\u53f0 - \u5546\u54c1\u66f4\u65b0 Request VO\")\n@Data\n@EqualsAndHashCode(callSuper = true)\npublic <strong>class<\/strong> <strong>ShopUpdateReqVO<\/strong> <strong>extends<\/strong> <strong>ShopBaseVO<\/strong> {\n \n    @ApiModelProperty(value = \"\u5546\u54c1\u7f16\u53f7\", required = true, example = \"1024\")\n    @NotNull(message = \"\u5546\u54c1\u7f16\u53f7\u4e0d\u80fd\u4e3a\u7a7a\")\n    <strong>private<\/strong> Long id;\n \n \n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>import<\/strong> io.swagger.annotations.ApiModel;\n<strong>import<\/strong> lombok.Data;\n<strong>import<\/strong> lombok.EqualsAndHashCode;\n<strong>import<\/strong> lombok.ToString;\n \n@ApiModel(\"\u7ba1\u7406\u540e\u53f0 - \u5546\u54c1\u521b\u5efa Request VO\")\n@Data\n@EqualsAndHashCode(callSuper = true)\n@ToString(callSuper = true)\npublic <strong>class<\/strong> <strong>ShopCreateReqVO<\/strong> <strong>extends<\/strong> <strong>ShopBaseVO<\/strong> {\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001\u5b9a\u4e49\u8f6c\u6362\u89c4\u5219 \u5b9a\u4e49\u7684\u7c7b\u4e0a\u8fb9\u589e\u52a0@Named\u6ce8\u89e3\u6807\u6ce8\u8f6c\u6362\u540d\u79f0 \u5b9a\u4e49\u8f6c\u6362\u89c4\u5219 \u4e8c\u3001\u4f7f\u7528\u8f6c\u6362\u89c4\u5219 \u4f7f\u7528@Mapp [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":935,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,8],"tags":[40],"_links":{"self":[{"href":"https:\/\/blog.frost-s.com\/index.php\/wp-json\/wp\/v2\/posts\/932"}],"collection":[{"href":"https:\/\/blog.frost-s.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.frost-s.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.frost-s.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.frost-s.com\/index.php\/wp-json\/wp\/v2\/comments?post=932"}],"version-history":[{"count":2,"href":"https:\/\/blog.frost-s.com\/index.php\/wp-json\/wp\/v2\/posts\/932\/revisions"}],"predecessor-version":[{"id":936,"href":"https:\/\/blog.frost-s.com\/index.php\/wp-json\/wp\/v2\/posts\/932\/revisions\/936"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.frost-s.com\/index.php\/wp-json\/wp\/v2\/media\/935"}],"wp:attachment":[{"href":"https:\/\/blog.frost-s.com\/index.php\/wp-json\/wp\/v2\/media?parent=932"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.frost-s.com\/index.php\/wp-json\/wp\/v2\/categories?post=932"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.frost-s.com\/index.php\/wp-json\/wp\/v2\/tags?post=932"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}