Używamy Jersey do implementacji API RESTful wykorzystując jego fajną cechę automatycznego generowania WADL.Uwzględnij możliwe wartości @PathParam do WADL
Tylko jako przykład mamy metoda
@GET
@Path("/{id}/{attribute}")
@Produces(MediaType.APPLICATION_JSON)
public Object getAttributeByID(@PathParam("id") long id, @PathParam("attribute") String attribute) {
....
}
To generuje następujący fragment w WADL:
<param type="xs:string" style="template" name="attribute:.*"/>
Atrybut może być name
, type
, size
i chcemy nie tylko do sprawdzania wartości w czasie wykonywania, ale również pokaż go w wygenerowanej wawelce Zgodnie z this document taka funkcja powinna być wspierana przez generowanie kilku znaczników <option>
wewnątrz <param>
, i . .e ja spodziewałem się czegoś tak:
<param type="aws:Attributes" style="template" name="attribute">
<option value="name"/>
<option value="type"/>
<option value="size"/>
</param>
Moim problemem jest to, aby włączyć go z Jersey. Jeśli nie udało się znaleźć odpowiedni dokument i zakłada się, że pewnie gdybym zmienić typ parametru z String
do enum
ta funkcja będzie działać automatycznie, więc zmienił podpis metody do:
@Path("/{id}/{attribute}")
@Produces(MediaType.APPLICATION_JSON)
public Object getAttributeByID(@PathParam("id") long id, @PathParam("attribute") Attribute attribute) {
....
}
gdzie
public enum Attribute {
name, type, size
}
ale Jersey nadal generuje znacznik <param>
bez opcji, a typem parametru jest nadal xs:string
.
Próbowałem znaleźć go w kodzie Jersey i znalazłem klasę com.sun.research.ws.wadl.Option
z odpowiednimi adnotacjami JAXB, więc wydaje mi się to istotne, ale nie wiem jak sprawić, żeby działało. Domyślam się, że problem jest w WadlGeneratorConfig
.
Oto odpowiednia część definicji Jersey w naszym web.xml
<filter>
<filter-name>REST-API</filter-name>
<filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class>
................
<init-param>
<param-name>com.sun.jersey.config.property.WadlGeneratorConfig</param-name>
<param-value>com.mycompany.resource.OurWADLGenerator</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.mycompany</param-value>
</init-param>
</filter>
gdzie kod OurWADLGenerator
jest:
public class OurWADLGenerator extends WadlGeneratorConfig {
@Override
public List<WadlGeneratorDescription> configure() {
return generator(WadlGeneratorApplicationDoc.class)
.prop("applicationDocsStream", "application-doc.xml")
.generator(WadlGeneratorResourceDocSupport.class)
.prop("resourceDocStream", "resourcedoc.xml").descriptions();
}
}
Co ja tu brakuje? Z góry dzięki.
'public enum Attribure' powinno być 'publiczne enum Attribute' ... zostało skopiowane z twojego kodu lub tylko literówki? –
@martinjakubik, na pewno to było literówka. Dziękuję Ci. Właśnie zredagowałem wpis i naprawiłem ten błąd. – AlexR