2010-10-19 46 views
5

Tôi có hai ứng dụng, một ứng dụng hoạt động dưới dạng ứng dụng khách và một ứng dụng khác làm máy chủ. Trong ứng dụng máy chủ, tôi tạo ra ObjectFactory và các lớp bằng cách sử dụng xjc từ Eclipse. Kết quả là, một trong các lớp này được gọi là widgetEvenCall. Từ xsd:Đậu java động từ xsd

... 
<xs:element name="widgetEventCall"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element minOccurs="1" maxOccurs="1" ref="tns:widgetEventDescriptor" /> 
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="tns:widgetParameter" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

JAXB xjc tạo ra các lớp WidgetEventCall, WidgetEventDescriptor và WidgetParameter, với getters và setters của chúng.

Việc áp dụng khách hàng, mà không có không phải những lớp cũng không phải là ObjectFactory, gọi từ xa một dịch vụ trên ứng dụng máy chủ, nhận được kết quả một XML như:

. . . 
<widgetEventCall> 
    <widgetEventDescriptor> ... </widgetEventDescriptor> 
    <widgetParameter>...</widgetParameter> 
    <widgetParameter>...</widgetParameter> 
    . . . 
</widgetEventCall> 

May mắn thay, ứng dụng khách hàng có quyền truy cập vào các định nghĩa .xsd. Câu hỏi của tôi là: Có thể, có nội dung xml và định nghĩa xsd, để tạo các đối tượng cho widgetEventCall, widgetEventDescriptor và widgetParameter như nếu chúng được tạo bởi xjc, bao gồm cả getters và setters, giữ ứng dụng khách không có kiến ​​thức về chúng, sử dụng độc quyền phản ánh? Có cách nào tự động để đạt được điều này?

Mục tiêu của tôi là sử dụng kết quả này vào tệp JSP, tức là đưa đối tượng vào yêu cầu và truy cập vào tiện ích con như widgetEventCall.widgetParameter [0] .someProperty, vì vậy tôi cần getters được tạo.

Xin cảm ơn trước.
Joan.

Trả lời

6

Bạn có thể sử dụng JAXB động của EclipseLink MOXy cho trường hợp sử dụng này (Tôi là trưởng nhóm công nghệ cao của MOXy).

Tạo bối cảnh động JAXB:

Các JAXBContext có thể được bootstrapped từ một XML:

FileInputStream xsdInputStream = new FileInputStream("src/example/customer.xsd"); 
DynamicJAXBContext jaxbContext = 
    DynamicJAXBContextFactory.createContextFromXSD(xsdInputStream, null, null, null); 

unmarshal XML:

Sau đó, bạn sử dụng một unmarshaller để chuyển đổi XML thành các đối tượng:

FileInputStream xmlInputStream = new FileInputStream("src/example/dynamic/customer.xml"); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
DynamicEntity customer = (DynamicEntity) unmarshaller.unmarshal(xmlInputStream); 

Tương tác với các dữ liệu:

Các thể hiện của DynamicEntity bạn trở lại là một đối tượng chung chung với các phương pháp get/set mà phải mất một tên thuộc tính. Tên thuộc tính tương ứng với những gì đã được tạo ra trên lớp tĩnh bởi XJC.

DynamicEntity address = jaxbContext.newDynamicEntity("org.example.Address"); 
address.set("street", "1 Any Street").set("city", "Any Town"); 
customer.set("address", address); 

soái đối tượng:

Sau đó, bạn sử dụng một marshaller để chuyển đổi XML thành các đối tượng:

Marshaller marshaller = jaxbContext.createMarshaller(); 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
marshaller.marshal(customer, System.out); 

Để biết thêm thông tin xem:

+1

Điều này có vẻ tuyệt vời!Tôi sẽ có một cái nhìn để thử, nhưng tôi sợ tôi không thể thêm các thư viện jar mới vào ứng dụng của tôi :(Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn. – Joan