编辑:

我发现了问题:我必须找到一种方法,使庄严的Codegen在生成Java类时删除“ visible = true”部分。如果我手动删除,它的工作原理。问题在于类在编译时生成,并且修改将被覆盖。

Stil需要帮助!

最初的职位:

我有以下几点:


具有列表的Reception实体类。 Checkpoint是基类,但是将仅包含子类,例如Checkpoint1,Checkpoint2等。
一个具有由“ / receptions”映射的HTTP POST方法的ReceptionCotroller。
Swagger CodeGen openapi 3.0.2生成的用于接收和检查点的DTO类(检查点基类,检查点1,检查点2等)。使用yml文件。 Checkpoint DTO具有一个名为“ dtype”的鉴别字段(在yml文件中),因此在将JSON反序列化为Checkpoint时,它知道它所引用的子类。


问题是当我添加属性:spring.jackson.deserialization.fail-on-unknown-properties = true时,它无法识别“ dtype”属性并且失败。我希望应用程序在遇到未知属性时失败,但要忽略“ dtype”。

我试图在Checkpoint DTO中添加一个dtype字段(在鉴别符定义旁边),但是作为响应返回的JSON具有2个dtype字段(一个带有discriminator值,一个带有null值)。

yml文件中的接收和检查点:

Reception:
      description: description1
      type: object
      properties:
        id:
          type: integer
          format: int64
          description: Id of the reception.
        checkpoints:
          type: array
          items:
            oneOf:
              - $ref: '#/components/schemas/Checkpoint1'
              - $ref: '#/components/schemas/Checkpoint2'
            discriminator:
              propertyName: dtype
            $ref: '#/components/schemas/Checkpoint'
          description: List of checkpoints attached to this reception.


Checkpoint:
      description: Checkpoint entity.
      type: object
      properties:
        checkpointId:
          type: string
          description: description1.
      required:
        - checkpointId
        - dtype
      discriminator:
        propertyName: dtype


生成的Checkpoint DTO类:

@ApiModel(description = "Checkpoint entity.")
@Validated
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "dtype", visible = true )
@JsonSubTypes({
  @JsonSubTypes.Type(value = Checkpoint1.class, name = "Checkpoint1"),
  @JsonSubTypes.Type(value = Checkpoint2.class, name = "Checkpoint2")
})
public class Checkpoint   {
  @JsonProperty("dtype")
  private String dtype = null;

  @JsonProperty("checkpointId")
  private String checkpointId = null;

(.....)


Json作为请求正文发送:

{
    "id": 123,
    "checkpoints": [
        {
            "dtype": "Checkpoint1",
            "checkpointId": "Checkpoint1"
                }
    }


它说它不识别dtype字段。我希望它创建适当的Checkpoint对象,但忽略Checkpoint DTO在生成的类中实际上不包含dtype字段。我不想让它忽略其他未知属性。例如:如果我在JSON中添加另一个“ fooBar”字段,我希望它失败。

希望所提供的信息可以理解我的问题。如果没有,我可以提供更多信息。

提前谢谢了!!
PS:请忽略最终的语法错误或拼写错误,代码可以正常工作并正确编译,但是我不知道如何仅忽略discriminator(dtype)属性。

最佳答案

有两种方法可以完成此操作。
首先:
如果允许您更改自动生成的Java代码,则可以将注释@JsonIgnoreProperties(value = [“ dtype”])添加到所有具有歧视字段的类中,如下所示。

@JsonIgnoreProperties(value = ["dtype"])
public class Checkpoint   {
//your properties here
}


一个示例实现:Use of JsonIgnoreProperties specific property deserialize properties exists only in JSON
问题有一个示例实现

第二:
如果不允许编辑自动生成的Java代码,则可以使用Jackson Mixins忽略特定的不需要的字段。

@JsonIgnoreProperties(value = ["dtype"])
public abstract class CheckpointMixin {}


并在您的对象映射器中为目标类注册此mixin,如下所示:

mapper.addMixIn(Checkpoint::class.java, CheckpointMixin::class.java)


我在Kotlin尝试了一下,效果很好。请忽略任何语法错误。

10-06 09:34