【问题标题】:How to make Swagger recognize @XmlTransient (e.g. not ignore it)如何让 Swagger 识别 @XmlTransient(例如不要忽略它)
【发布时间】:2014-12-03 22:12:10
【问题描述】:

似乎Swagger 忽略了JAXB 注释,例如@XmlTransient

此外,Swagger 似乎也解析 getter,忽略 @XmlAccessorType(XmlAccessType.FIELD)

有没有办法指定Swagger 尊重JAXB 注释?

更新

代码示例

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;

import com.wordnik.swagger.annotations.ApiModel;
import com.wordnik.swagger.annotations.ApiModelProperty;

    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    @ApiModel( value = "aaa")
    public class A implements IA
    {
        @ApiModelProperty( value = "bla", required = true )
        @XmlElement(name="a")
        private String a;

        @XmlTransient 
        private B b;

         private A() {}//JAXB

         @XmlTransient
         public boolean isC() { return true;};
}

接口 IA 没有注释。并且没有可能干扰字段 b 的吸气剂。

swagger 生成的 JSON 是:

"A": {
      "id": "A",
      "description": "aaa",
      "properties": {
        "c": {
          "type": "boolean"
        }
      }
    }

如 Swagger 所见,忽略字段和 @XMLAccesorType(正如 Webron 在他的回答中指出的那样) 但也忽略了isC() getter 函数上的 JAXB 注释(@XmlTransient

【问题讨论】:

  • 您使用哪个版本的 swagger-core?是直接使用还是作为其他库的依赖(比如swagger-springmvc、spray-swagger)?
  • swagger-jersey-jaxrs_2.10 v1.3.10
  • 字段/方法是否有任何附加注释?您可以编辑问题并提供示例模型类吗?
  • 根据您的要求更新了问题
  • 更新:当人们转向 swagger 2.0 规范时。 JsonIgnore 有效。 XmlTransient 不...

标签: java rest jaxb jackson swagger


【解决方案1】:

当我更改版本时,它对我有用。 例如。它适用于 swagger-jaxrs_2.10 v 1.3.6

请注意,它不适用于 swagger-jaxrs_2.10 v 1.3.0 或在 swagger-jeresy-jaxrs_2.10 v 1.3.10...

至少现在@JsonIgnore@XmlTransient 受到尊重

【讨论】:

  • 请注意,在对您的问题的评论中,您提到您使用的是 1.3.10,它比这里提到的都晚。
  • 是的,当我使用 swagger-jersey-jaxrs_2.10 v1.3.10 时,这对我不起作用,然后我转移到 swagger-jaxrs_2.10 并在那里使用了 1.3.0。仍然没有工作。然后我搬到了 1.3.6
  • 改写答案以支持 cmets 讨论
【解决方案2】:

根据我的测试,该示例无法正常工作。由于没有公共访问器或公共字段,因此 swagger-core 内省无法完全正常工作。

一旦我只为a 添加了访问器,它就会生成一个只有a 字段的模型。

如果该字段是私有的,并且没有访问器,则无论@XmlTransient 是否存在,它都不会包含在模型中。使用访问器,@XmlTransient 工作得很好。

请记住,swagger-core(当前)不处理 @XmlAccessorType

我怀疑样本不完整,无法进一步调查。

【讨论】:

  • 我已经编辑了示例以添加一个私有的Ctor。 Jackson(和 gson)能够序列化
  • 我已经编辑了示例以添加一个私有的Ctor。杰克逊(和 gson)能够序列化\反序列化类。如果 Swagger 不处理 XmlAccessorType 这意味着它将始终寻找 getter。但是,即使我用 xmltransient 标记 isC() 也不会受到尊重
  • 该代码甚至无法编译。我需要一个完整的测试用例。隐藏信息没有帮助。提供具有已实现接口的完整类(如果有)以及结果输出。没有它,我只是在黑暗中拍摄。
  • 更改了编译代码并发布了 Swagger 生成的 JSON。我为早期版本道歉,试图手动混淆一个工作示例。
  • 再一次,这给了我一个完全不同的输出。你使用 Java 8 吗?如果是这样,您的界面是否有任何默认方法?自己尝试一下,按原样使用该代码,删除接口(正如您所说的那样,它什么也没添加)并自己查看输出。
【解决方案3】:

对于 2019 年的 swagger 用户,只需在方法之上使用 swagger 注释 @Hidden@XmlTransient

@XmlTransient
@Hidden
public getFoo(){
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多