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<> 包装器等。
去掉命名的复杂类型,问题就解决了。
我正在使用 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<> 包装器等。 去掉命名的复杂类型,问题就解决了。