gpt4 book ai didi

java - WADL/生成的 XSD 的问题,使用 Jersey 和契约优先的方法

转载 作者:IT老高 更新时间:2023-10-28 20:25:36 53 4
gpt4 key购买 nike

几天来,我一直在使用 Jersey 开发 REST Web 服务,并设法让所有 CRUD 操作正常工作,并使用多种交换格式:XML、JSON、Google Protobuf。

但是我遇到了一些与自动生成的 WADL 和 XSD 相关的问题。


上下文

为了定义以这三种格式交换的对象,我遵循了“契约优先”的方法:

  • 根据我编写的 XSD,我使用 JAXB 生成了我的模型类;
  • 从我编写的等效 proto 文件中,我生成了 Google Protobuf 类(并且在内部有一种方法可以将这些类转换为 JAXB 生成的对象,以便拥有一个独特的模型)。

但是,由于我希望我的用户也能够生成他们的类,我想共享这些架构文件(.xsd 和 .proto)并让它们很好地集成使用自动生成的 WADL

为此,感谢 this维基页面:

  • 我已经暴露了下面的两个文件
    • /schema/schema.xsd
    • /schema/schema.proto
  • 我添加了一个应用语法文件:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <grammars xmlns="http://wadl.dev.java.net/2009/02"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xi="http://www.w3.org/1999/XML/xinclude">
    <include href="../schema/schema.xsd" />
    </grammars>
  • 我添加了一个自定义的 WADL 生成器:

     public class RichWadlGeneratorConfig extends WadlGeneratorConfig {
    @Override
    public List<WadlGeneratorDescription> configure() {
    return generator(WadlGeneratorApplicationDoc.class)
    .prop("applicationDocsStream", "application-doc.xml")
    .generator(WadlGeneratorGrammarsSupport.class)
    .prop("grammarsStream", "application-grammars.xml")
    .descriptions();
    }
    }

这样,当我点击 /rest/application.wadl 时,下面会出现在 WADL 中:

<grammars>
<include href="../schema/schema.xsd"/>
<include href="application.wadl/xsd0.xsd">
<doc title="Generated" xml:lang="en"/>
</include>
</grammars>

问题

/rest/application.wadl/xsd0.xsd 是从我的类中自动生成的,但与我最初在 schema.xsd 中的完全不同 。除此之外,在这个 WADL 上调用像 wadl2java 这样的工具会惨遭失败,大概是因为

  • /schema/schema.xsd,以及
  • /rest/application.wadl/xsd0.xsd

现在有冲突(相同对象的两个定义)。


问题

  1. 有没有办法禁用这个自动生成的 XSD 的生成和传播?(因为我遵循这种“契约(Contract)优先”的方法,所以我不需要它)

  2. 如果没有,当 /rest/application.wadl/xsd0.xsd 被命中时,有没有办法用我手动编写的 XSD “覆盖”其内容?(我用谷歌搜索并找到了有关 WadlResource 的信息,用于生成自定义的 WADL,但没有发现有关 XSD 生成本身的信息)


提前感谢您的帮助!

M.


编辑

1) 我向泽西队提出了这个问题并得到了回复: http://java.net/projects/jersey/lists/users/archive/2012-06/message/8

2) 根据 Pavel 的指示,我提出了一张罚单 (JERSEY-1230)。我目前正在跟进,要么自己提交修复,要么从泽西队获得修复。

最佳答案

1.14-SNAPSHOT应该允许你这样做:

public class SampleWadlGeneratorConfig extends WadlGeneratorConfig {

@Override
public List<WadlGeneratorDescription> configure() {
return generator( WadlGeneratorApplicationDoc.class )
.prop( "applicationDocsStream", "application-doc.xml" )
.generator( WadlGeneratorGrammarsSupport.class )
.prop( "grammarsStream", "application-grammars.xml" )
.prop("overrideGrammars", true) // !!!
.generator( WadlGeneratorResourceDocSupport.class )
.prop( "resourceDocStream", "resourcedoc.xml" )
.descriptions();
}

}

当 overrideGrammars 设置为 true 时,Jersey 生成的语法将不会包含在返回的 WADL 中。

关于java - WADL/生成的 XSD 的问题,使用 Jersey 和契约优先的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10870583/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com