Tôi đang gặp khó khăn trong một vài ngày với vấn đề sau. Tôi đã tìm kiếm khá nhiều câu trả lời, ở đây trong SO, trong danh sách gửi thư jersey và mạng nói chung, nhưng không thể tìm thấy câu trả lời cho câu hỏi cụ thể này.WADL đã tạo cho Danh sách tài nguyên
Thiết lập miền vấn đề ...
Tôi đang sử dụng Jersey 1.16 bên Tomcat 7.
Tôi đã tạo ra một nguồn lực JAX-RS đơn giản như thế này:
@Path("/")
@Produces({ "application/xml", "text/plain" })
public class ExampleResource {
@GET
public List<Thing> getThings() {
List<Thing> list = new ArrayList<>();
list.add(new Thing("a thing 1", "a thing description 1"));
list.add(new Thing("a thing 2", "a thing description 2"));
return list;
}
}
Thing
là một POJO được chú thích JAXB trông giống như thế này
@XmlRootElement(name = "thing")
public class Thing {
private String name;
private String description;
// getters, setters and @XmlElement annotations ommited for brevity
Tôi cũng đã định cấu hình WadlGeneratorJAXBGrammarGenerator.class
Và khi tôi yêu cầu GET http://localhost:8092/rest
, nó hoạt động như một bộ sưu tập có định dạng độc đáo - Thing
được trả lại.
sẽ tự động tạo ra WADL http://localhost:8092/rest/application.wadl
là gần như hoàn hảo, nó trông như thế này:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<application xmlns="http://wadl.dev.java.net/2009/02">
<doc xmlns:jersey="http://jersey.java.net/" jersey:generatedBy="Jersey: 1.16 11/28/2012 02:09 PM" />
<grammars>
<include href="application.wadl/xsd0.xsd">
<doc title="Generated" xml:lang="en" />
</include>
</grammars>
<resources base="http://localhost:8092/rest/">
<resource path="/">
<method id="getThings" name="GET">
<response>
<ns2:representation xmlns:ns2="http://wadl.dev.java.net/2009/02"
xmlns="" element="thing" mediaType="application/xml" />
<representation mediaType="text/plain" />
</response>
</method>
</resource>
</resources>
</application>
Như tôi đã nói, gần như hoàn hảo, và nằm trong đó vấn đề.
<ns2:representation xmlns:ns2="http://wadl.dev.java.net/2009/02"
xmlns="" element="thing" mediaType="application/xml" />
WADL không mô tả rằng /getThings
trả về List<Thing>
. Thay vào đó, có vẻ như nó đang đề cập đến một phần tử đơn lẻ thing
trong xsd0.xsd
. Vì vậy, khi tôi cho nó ăn, ví dụ: wadl2java, nó tạo ra khách hàng chưa được phân loại. Để có được một List<Thing>
tôi phải tự mã hóa nó, một cái gì đó giống như
List<Thing> asXml = root().getAsXml(new GenericType<List<Thing>>(){});
Có ai biết nếu nó có thể có tự động tạo ra WADL rằng bằng cách nào đó sẽ chỉ ra rằng tài nguyên đặc biệt này đang trở lại một danh sách tài nguyên của một loại cụ thể?
Và tôi không muốn tạo thêm "ThingList" JAXB-chú thích lớp và trả về thay vì trong tài nguyên jersey của tôi.
Tôi gần như ở đó với việc tạo ra những "hoàn hảo" WADL, nó chỉ là này (hy vọng) ít mảnh mà tôi đang thiếu ...
Cảm ơn bạn rất nhiều!
Tôi không quá quen thuộc với wadl, nhưng, những gì giá trị (XML) sẽ được tối ưu cho dòng bạn trích dẫn? Trong các wsdls, các danh sách và các đối tượng đơn giản được biểu diễn gần như giống nhau. – acdcjunior
Nó không đến với tâm trí của tôi để so sánh với WSDL như là một vấn đề của thực tế kể từ khi tôi đã gần như không có kinh nghiệm với nó. Vì vậy, bạn có một điểm tốt. Đối với những gì nó sẽ như thế nào, tôi không quá chắc chắn về điều đó một trong hai. Có lẽ bạn có thể đưa ra một ví dụ về những gì nó muốn trong WSDL? – Svilen
Trong một WSDL, một thực thể (nói 'Person') trở thành một' xs: complexType' với một phần tử cho mỗi thuộc tính mà nó có. Một thuộc tính, nói 'String name', trông giống như' '(' minOccurs = '0'' ngụ ý rằng đó là một trường tùy chọn). Một thuộc tính là một danh sách, nói rằng 'String [] biệt danh' sẽ trở thành một cái gì đó như:' '. Như bạn có thể thấy, sự khác biệt duy nhất từ một trường đơn giản đến một danh sách là 'maxOccurs = 'unbounded''. –
acdcjunior