使用 Mapstruct 从 DTO 中的 JSON Array/JSON 对象映射到 JPA DB POJO 中的字符串

Mapping from JSON Array/JSON Object in DTO to String in JPA DB POJO using Mapstruct

我的要求如下

我的 DTO API 将有一个字段可以接收 JSON 数组或 JSON 对象作为输入。

例如

{
"name" : { "firstName" : "ABC", "lastName" : "pqr", "email" : "abc.pqr@xyz.com" },
"skills" : ["Java", "JS", "Mongo", "JPA"]
}

这需要使用域 POJO 中的 JPA 作为字符串存储在数据库中

字段名称: "{\"firstName\":\"ABC\",\"lastName\":\"pqr\",\"email\":\"abc.pqr@xyz.com\"}"

现场技能: "[\"Java\",\"JS\",\"Mongo\",\"JPA\"]"

在通过 GET API 检索数据库时应该发生相反的情况,字符串应该在响应负载中转换回 JSON。

是否有使用 mapstruct 库执行此操作的示例

Mapstruct 不能很好地映射未知状态,但如果一个字段总是 JSONArrayJSONObject 那么它是可能的。在未知状态的情况下,(例如它被键入为 Object)使用 @SubclassMapping 注释可能是一个选项。 See here for more information about subclass mappings

在任何一种情况下,都需要引入一种从 JSONArrayString 然后再返回的方法。 JSONObject.

相同

例如:


    String from(JSONArray array) {
        return array.toJSONString( JSONStyle.NO_COMPRESS );
    }

    String from(JSONObject object) {
        return object.toJSONString( JSONStyle.NO_COMPRESS );
    }

    JSONArray toArray(String array) {
        try {
            return (JSONArray) new JSONParser( JSONParser.MODE_JSON_SIMPLE ).parse( array );
        }
        catch ( ParseException e ) {
            throw new RuntimeException( e );
        }
    }

    JSONObject toObject(String object) {
        try {
            return (JSONObject) new JSONParser( JSONParser.MODE_JSON_SIMPLE ).parse( object );
        }
        catch ( ParseException e ) {
            throw new RuntimeException( e );
        }
    }

假设 DTO 被命名为 ProgrammerDto 并且域对象 Programmer 向映射器添加另外 2 个方法将允许两者之间的转换。假设 POJO 字段与 DTO 字段的调用相同,否则您将需要添加映射。

    ProgrammerDto map(Programmer programmer);
    Programmer map(ProgrammerDto programmerDto);

ps。 map 方法是抽象的,或者其他方法是默认的。这取决于使用的是抽象 class 还是接口。