WADL(泽西岛)中的空语法

Empty grammar in WADL (Jersey)

我正在使用 Jersey JAX-RS 开发服务器。当我访问应用程序 WADL 时,它包含所有操作的描述,但没有引用 XML 模式(语法元素为空)。

这是我所拥有的简化版本。 XML 架构:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="parent" type="Parent" />
<xsd:complexType name="Parent">
    <xsd:sequence>
        <xsd:element name="son" minOccurs="0" maxOccurs="unbounded">
            <xsd:complexType>
                <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
        </xsd:element>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>

这里有一个.java用于处理请求,classParent是JAXB自动生成的。 代码编译和处理请求都很好,如果有语法错误,那只是因为我复制了一小部分代码。

@Path("/parents")
public class ParentAPI {
    private static ObjectFactory jaxbOf = new ObjectFactory();

    @GET
    @ApiOperation(value = "getParent")
    @ApiResponses(value = { @ApiResponse(code = 200, message = "OK"),
            @ApiResponse(code = 500, message = "Internal Server Error") })
    @Produces({ MediaType.APPLICATION_XML, MediaType.TEXT_XML })
    @Path("/{name}")
    public JAXBElement<Parent> getParent(@PathParam("name") String name) {
        Parent parent = new Parent();
        //.....
        return jaxbOf.createParent(parent);
    }

    @POST
    @ApiOperation(value = "postParent")
    @ApiResponses(
            value = { @ApiResponse(code = 201, message = "Created"), @ApiResponse(code = 400, message = "Bad request"),
                    @ApiResponse(code = 500, message = "Internal Server Error") })
    @Produces({ MediaType.TEXT_XML })
    @Consumes({ MediaType.APPLICATION_XML })
    public Response postNode(JAXBElement<Parent> jaxbParent, @Context UriInfo uriInfo) {
        Parent parent = jaxbParent.getValue();
        //.....

        UriBuilder builder = uriInfo.getAbsolutePathBuilder();
        URI u = builder.path(parent.getName()).build();
        return Response.created(u).build();

    }
}

我正在使用 JAXBElement<> 包装器,因为我在模式中命名了 complexTypes。此外,我正在使用实现 MessageBodyReader<JAXBElement<?>.

的验证器

这是web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">
    <display-name>Example</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>Jersey RESTful Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>io.swagger.jaxrs.listing, it.example</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>Jersey2Config</servlet-name>
        <servlet-class>io.swagger.jersey.config.JerseyJaxrsConfig</servlet-class>
        <init-param>
            <param-name>api.version</param-name>
            <param-value>1.0.0</param-value>
        </init-param>
        <init-param>
            <param-name>swagger.api.basepath</param-name>
            <param-value>http://localhost:8080/Example/rest</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey RESTful Application</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

现在,我尝试将 xsd 公开到 WebContent 中,但仍然没有成功,它也没有出现在 WADL(自动生成)中。我正在用ANT编译打包。

我在其他问题中仔细搜索,有人没有答案,其他人是旧的,并建议使用我没有的 Servlet 库的解决方案(我不能添加,因为它是一个作业,我们有一套我们可以使用的库),看起来在 Jersey 中模式应该默认在 WADL 中,所以我真的不明白哪里出了问题。

问题是我使用的是命名的复杂类型,这导致我使用 JAXBElement<> 包装器等。 去掉命名的复杂类型,问题就解决了。