我有一些REST服务(使用和生成application/json),我用它@TypeHint
来生成文档.
现在我有这样的事情:
import javax.ws.rs.core.Response;
...
@Path("/path")
public class MyClass {
@GET
@TypeHint(MyResponse.class)
public Response getIt() {
MyResponse resp = ... ;
return MyBuilder.build(resp);
}
}
Run Code Online (Sandbox Code Playgroud)
但是MyResponse
是一个包装List<MyType>
.
我的build
方法MyResponse
看起来像这样:
public static Response build(Serializable payload) {
return Response.ok(msr).header(...).build();
}
Run Code Online (Sandbox Code Playgroud)
我想直接使用List<MyType>
而不是MyResponse
.TypeHint
在以下代码中使用哪种方法最好?
@GET
@TypeHint(/* TODO */)
public Response getIt() {
List<MyType> myList = ... ;
return MyBuilder.build(myList);
}
Run Code Online (Sandbox Code Playgroud)
我在考虑以下选项:
@TypeHint(List.class)
@TypeHint(MyType.class)
@TypeHint(List<MyType>.class)
- >遗憾的是,由于Java类型擦除,这不起作用.题:
3号有没有有效的替代方案? …
我有一个名为enunciate的maven插件,它可以生成很好的API文档.我宁愿使用Gradle作为我的构建工具,但看起来它在这方面有限,或者我只是不知道如何使用它.
我想知道是否有可能以某种方式在gradle中使用maven插件(enunciate)?我是否必须编写一个蚂蚁脚本并调用它?到目前为止,我无法找到发音的gradle示例,所以我猜它不受支持?
我正在使用enunciate生成REST API的Swagger文档.我的一个遗留bean包含一个Map,Swagger抱怨这个:
[INFO] --- maven-enunciate-plugin:1.27:docs (default) @ foo-api ---
[INFO] initializing enunciate.
[INFO] invoking enunciate:generate step...
[WARNING] Validation result has errors.
/.../rest/BarBean.java:170: [swagger] Swagger isn't smart enough to handle anonymous types (such as maps).
public HashMap<String, BazBean> getBazBeans() {
Run Code Online (Sandbox Code Playgroud)
是否有任何注释我可以放入bean类中,以便Swagger可以处理这个?
除此之外,有没有办法让Swagger简单地忽略这个领域或全班?我知道Swagger在没有@XmlRootElement
注释的情况下忽略了类,但是BazBean
在另一个接受XML的端点中不幸地使用了它.
我正在努力处理我认为非常简单的事情 - 为一组已经存在的REST服务生成文档,这些服务基本上只是用JAX-RS注释注释的POJO .我使用Jersey作为实现提供者.REST API作为Spring Web应用程序的一部分进行部署.
我想只生成REST服务POJO的文档,所以我的enunciate.xml配置是这样的:
<?xml version="1.0"?>
<enunciate label="novaglobalapi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://enunciate.codehaus.org/schemas/enunciate-1.25.xsd">
<api-classes>
<include pattern="com.something.api.rest.*"/>
</api-classes>
<modules>
<docs docsDir="restapi" title="REST API"/>
</modules>
</enunciate>
Run Code Online (Sandbox Code Playgroud)
我按照enunciate文档中的建议配置了我的pom.xml:
<build>
...
<plugin>
<groupId>org.codehaus.enunciate</groupId>
<artifactId>maven-enunciate-plugin</artifactId>
<version>1.25</version>
<executions>
<execution>
<goals>
<goal>docs</goal>
</goals>
</execution>
</executions>
<configuration>
<configFile>enunciate.xml</configFile>
</configuration>
</plugin>
...
</build>
Run Code Online (Sandbox Code Playgroud)
但是当我运行时mvn enunciate:docs
,我收到以下构建错误:
[ERROR] Failed to execute goal org.codehaus.enunciate:maven-enunciate-plugin:1.25:docs (default-cli) on project NovaGlobalSSOAPI: Problem assembling the enunciate app. invalid LOC header (bad signature) -> …
Run Code Online (Sandbox Code Playgroud) 目前Enunciate生成REST API文档,但Response Body不包含有关响应的JSON结构的信息.根据我的理解,如果我将类包含在由Jersey to JSON序列化/反序列化的数据实体中,则enunciate将能够生成该文档的那一部分.
数据实体位于不同的模块中,按照发布文档 - 多模块项目中的建议与其源一起打包
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.2</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
...
Run Code Online (Sandbox Code Playgroud)
这就是我的enunciate.xml的样子:
<?xml version="1.0"?>
<enunciate label="someapi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://enunciate.codehaus.org/schemas/enunciate-1.25.xsd">
<api-import pattern="com.something.business.vo.**"/>
<api-import pattern="com.something.business.domain.**"/>
<api-classes>
<include pattern="com.something.web.ssoApi.rest.*"/>
<include pattern="com.something.business.vo.**"/>
<include pattern="com.something.business.domain.**"/>
</api-classes>
</enunciate>
Run Code Online (Sandbox Code Playgroud)
这就是文档的样子:
如您所见,响应主体只包含element: (custom)
.
如何使其包含响应的JSON结构?
您如何记录REST API?不仅仅是资源是什么的文档,而且实际上是什么是在请求中发送的数据以及在响应中发回的数据.知道某些东西需要发送XML并返回XML是没有用的; 或JASN; 管他呢.如何记录请求中发送的数据以及响应中发回的数据?
到目前为止,我能找到的最好的是Enunciate工具,您可以在其中记录REST API和数据元素.是否为此设置了正确的工具类型,我是否错过任何其他提供此功能的工具,我应该看一下?
我的REST API的消费者可以使用任何语言python,Java,.NET等
问题是如何让java 1.8和maven-enunciate-plugin一起工作?
使用maven插件org.codehaus.enunciate version 1.29
和OSX JDK 1.7.0_25
一切都很好.Enunciate取决于apt
,我看到此运行时警告 1.7.0_25
[INFO]调用enunciate:generate step ...
警告:计划在下一个主要JDK版本中删除apt工具及其关联的API.这些功能已被javac和标准化的注释处理API javax.annotation.processing和javax.lang.model取代.建议用户迁移到javac的注释处理功能; 有关更多信息,请参阅javac手册页.
更改1.8.0_05
构建失败时...
apt
确实没了,因此com.sun.mirror.apt.AnnotationProcessorFactory
没有找到运行时错误.
mvn install -pl myProject -e -X
...
<snip>
urls[46] = file:/Users/k1/.m2/repository/org/codehaus/enunciate/enunciate-xml/1.29/enunciate-xml-1.29.jar
urls[47] = file:/Users/k1/.m2/repository/org/codehaus/enunciate/enunciate-java-client/1.29/enunciate-java-client-1.29.jar
urls[48] = file:/Users/k1/.m2/repository/org/codehaus/enunciate/enunciate-c/1.29/enunciate-c-1.29.jar
urls[49] = file:/Users/k1/.m2/repository/org/codehaus/enunciate/enunciate-obj-c/1.29/enunciate-obj-c-1.29.jar
urls[50] = file:/Users/k1/.m2/repository/org/codehaus/enunciate/enunciate-csharp/1.29/enunciate-csharp-1.29.jar
urls[51] = file:/Users/k1/.m2/repository/org/codehaus/enunciate/enunciate-ruby/1.29/enunciate-ruby-1.29.jar
urls[52] = file:/Users/k1/.m2/repository/org/codehaus/enunciate/enunciate-php/1.29/enunciate-php-1.29.jar
Number of foreign imports: 1
import: Entry[import from realm ClassRealm[maven.api, parent: null]]
-----------------------------------------------------
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:165)
... 20 more
Caused by: java.lang.NoClassDefFoundError: com/sun/mirror/apt/AnnotationProcessorFactory
at org.codehaus.enunciate.DocsMojo.loadMavenSpecificEnunciate(DocsMojo.java:107)
at …
Run Code Online (Sandbox Code Playgroud) 尝试使用Enunciate生成Java项目的文档时,我收到了以下堆栈跟踪.我正在使用JDK 1.8.0_25和Enunciate 1.30 RC1.
BUILD FAILED
C:\dev\PayWay\make\build.xml:882: java.lang.NoClassDefFoundError: com/sun/mirror/apt/AnnotationProcessorFactory
at org.codehaus.enunciate.main.EnunciateTask.execute(EnunciateTask.java:93)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:435)
at org.apache.tools.ant.Target.performTasks(Target.java:456)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1248)
at org.apache.tools.ant.Main.runBuild(Main.java:851)
at org.apache.tools.ant.Main.startAnt(Main.java:235)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
Caused by: java.lang.ClassNotFoundException: com.sun.mirror.apt.AnnotationProcessorFactory
at org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1374)
at org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1323)
at org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:1076)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 17 more
Run Code Online (Sandbox Code Playgroud)
这个问题的原因是什么?
Enunciate
cxf-jaxrs-servlet.xml
自动生成文件并指定:org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider
作为JAX-RS
提供者.此课程已更改为com.fasterxml.jackson.jaxrs.JacksonJaxbJsonProvider
最新的Jackson
库.如何在自动生成的文件Enunciate
中将新类指定为JSON
提供程序?或者我可以Enunciate
使用用户提供的XML
文件?
给定一个抽象的,通用的Resource类和具体实现:
public abstract class AbstractResource<T> {
@Autowired
private SomeService<T> service;
@Path("/{id}")
@GET
public T get(@PathParam("id") String id) {
return service.get(id);
}
}
@Path("/people")
public class PersonResource extends AbstractResource<Person> { }
Run Code Online (Sandbox Code Playgroud)
看来,在生成文档时PersonResource
,Enunciate没有拿起get()
返回a 的事实Person
.
Person未列在"数据模型">"数据类型"部分中.
在GET部分下,Response Body将元素类型显示为"(custom)".
这些问题是因为使用泛型作为实体类型吗?有没有办法提示发音真实类型是什么,以便正确生成文档?