Существует ли обходной путь для определения многомерных массивов в классе API (цель Docs Maven)?
Я получаю сообщение об ошибке "Поддержка многомерных массивов пока не поддерживается" при запуске документа. Есть ли способ, которым я могу избежать бомбардировки процесса (т. Е. Генерировать остальные документы для API)?
Я попытался @org.codehaus.enunciate.doc.ExcludeFromDocumentation в методе API, возвращая класс с двойным массивом. Я попытался @ org.codehaus.enunciate.XmlTransient в классе с двойным массивом.
С тех пор я видел в документации enunciate, где они влияют только на то, будут ли они отображаться в документах, а не на компиляцию.
Я рад услышать любые ваши идеи!
Благодарю.
Редактировать: лучшее, что я мог сделать, это выгрузить проект во временный каталог, вырвать все модули, которые не нужны для доступа к API, удалить класс с двойным массивом и заменить эту часть сигнатуры java-метода REST-API на String. Это позволяет мне по крайней мере создать страницу документа api через enunciate и дать описание через javadoc. Но я хотел бы иметь более элегантное решение, поэтому, пожалуйста, поделитесь, если вы знаете одно:)
Изменить 2: Пример пом:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.company.services.rest.service</groupId>
<artifactId>service-rest-api</artifactId>
<packaging>pom</packaging>
<version>1.1</version>
<name>service REST API</name>
<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>2.2.1.GA</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>jaxrs-api</artifactId>
<version>2.2.1.GA</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>2.2.1.GA</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>2.2.1.GA</version>
<exclusions>
<exclusion>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-multipart-provider</artifactId>
<version>2.2.1.GA</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>tjws</artifactId>
<version>2.2.1.GA</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.enunciate</groupId>
<artifactId>maven-enunciate-plugin</artifactId>
<version>1.26</version>
<configuration>
<forceWarPackaging>false</forceWarPackaging>
<configFile>/tmp/enunciate-work/enunciate.xml</configFile>
</configuration>
<executions>
<execution>
<goals>
<goal>docs</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Файлы, расположенные в src / main / java / com / company / services / user / rest:
package com.company.services.service.rest;
import javax.ws.rs.POST;
import javax.ws.rs.Produces;
import javax.ws.rs.Consumes;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
@Path("/")
public interface ServiceResource {
@POST
@Path("/statuschanges")
@Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
@Consumes({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
public ServiceStatusChanges getServiceStatusChangeLogs(String string);
}
package com.company.services.service.rest;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class ServiceStatusChanges implements Serializable {
private static final long serialVersionUID = 1l;
private String[][] logs;
public ServiceStatusChanges() {}
public ServiceStatusChanges(String[][] logs) {
this.logs=logs;
}
public String[][] getLogs() {
return logs;
}
public void setLogs(String[][] logs) {
this.logs=logs;
}
}
enunciate.xml:
<enunciate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="
http://enunciate.codehaus.org/schemas/enunciate-1.26.xsd">
<modules>
<disable-rule id="csharp.warnings"/>
<disable-rule id="c.warnings"/>
<disable-rule id="obj-c.warnings"/>
<docs docsDir="api" title="REST API" includeDefaultDownloads="false" disableRestMountpoint="true">
</docs>
<!-- Disable all the client generation tools -->
<basic-app disabled="true" />
<c disabled="true" />
<csharp disabled="true" />
<java-client disabled="true" />
<jaxws-client disabled="true" />
<jaxws-ri disabled="false" />
<jaxws-support disabled="false" />
<jersey disabled="true" />
<obj-c disabled="true" />
<xml forceExampleJson="true"/>
<jaxws disabled="false"/>
<amf disabled="true"/>
</modules>
</enunciate>
2 ответа
Enunciate поколение документов выжил, когда я использовал List<String[]>
тип вместо String[][]
, Насколько я помню, сгенерированные примеры JSON/XML и xsd казались проблематичными.
Если вам не нужна поддержка XML для этого метода, вы можете просто сделать JSON и удалить аннотацию @XmlRootElement после удаления MediaType.APPLICATION_XML из @Consumes и @Produces.
Если вы по-прежнему хотите поддерживать XML, вы можете внести некоторые улучшения для поддержки изменений только для сериализации, например сделать logs
Свойство XML временное и перенос массива как время сериализации. Это будет иметь дополнительное преимущество, поскольку Enunciate сможет документировать его вместо некоторой внеполосной документации. Например:
@XmlRootElement
public class ServiceStatusChanges implements Serializable {
private static final long serialVersionUID = 1l;
private String[][] logs;
public ServiceStatusChanges() {}
public ServiceStatusChanges(String[][] logs) {
this.logs=logs;
}
@XmlTransient
public String[][] getLogs() {
return logs;
}
public void setLogs(String[][] logs) {
this.logs=logs;
}
@XmlElement( name = "logs" )
public Log[] getLogsWrapped() {
Log[] logs = new Log[this.logs.length];
//iterate through the logs and wrap it...
return logs;
}
}
И ваш Log
класс может выглядеть так:
@XmlRootElement
public class Log implements Serializable {
@XmlValue
public String value;
}