2012-01-16 31 views
5

Chúng tôi có một ứng dụng web máy chủ Java, nơi cốt lõi của hệ thống chứa một mô hình miền rất phức tạp được thiết kế theo các nguyên tắc của thiết kế điều khiển miền. Đối với hầu hết các phần, các đối tượng miền này đã bị ảnh hưởng rất ít bởi các ứng dụng khác.Cách tốt nhất để triển khai các mối quan hệ liên kết cho HATEOAS trong XML?

Chúng tôi hiện đang tìm cách đặt API dịch vụ web REST ở phía trước hệ thống và tôi đang đấu tranh với cách triển khai tốt nhất các liên kết HATEOAS có trong loại phương tiện mới của riêng chúng tôi. Ví dụ, cho phép nói rằng chúng ta có lớp miền foo có một id và tên thuộc tính với các chú thích JAX-B:

@XmlType(name = "foo") 
public class FooImpl implements Foo { 

    private String name; 
    private String id; 

    ...snip.... 

@XmlID 
@XmlAttribute 
@Override 
public String getId() { 
    return id; 
} 

    @XmlElement 
    @Override 
    public String getName() { 
     return name; 
    } 

    @Override 
    public void setName(final String name) { 
     this.name = name; 
    } 
} 

Nhưng XML Tôi muốn quay trở lại trông như sau:

<foo id="123" href="http://myserver.com/foos/123"> 
    <name>myFoo</name> 
    <links> 
      <link rel="previous" href="http://myserver.com/foos/122" type="application/mything+xml" /> 
      <link rel="next" href="http://myserver.com/foos/124" type="application/mything+xml" /> 
      <link rel="edit" href="http://myserver.com/foos/123" type="application/mything+xml" /> 
      <link rel="revise" href="http://myserver.com/foos/123" method="put" type="application/mything+xml" /> 
      <link rel="cancel" href="http://myserver.com/foos/123?op="cancel"" method="post" type="application/mything+xml" /> 
    </links> 
</foo> 

là gì cách tốt nhất để làm điều này sao cho tôi không có thiết kế tên miền bị ô nhiễm với các liên kết loại phương tiện truyền thông này, nhưng vẫn có thể sử dụng sức mạnh của JAX-B cho việc sắp xếp XML? Dưới đây là một số suy nghĩ:

1) Bộ tiếp hợp JAX-B - Tôi có thể sử dụng những điều này để sửa đổi XML cho các thực thể và chèn liên kết ... có thể không? nó có hợp lý không? Bất kỳ ví dụ nào?

2) Lớp DTO - Tạo một lớp dịch vụ REST mới để chuyển đổi các đối tượng miền của tôi trong DTO. Cho đến nay chúng tôi đã có thể tránh được những rắc rối của DTO. Mặc dù điều này sẽ cung cấp sự linh hoạt hoàn toàn trong những gì chúng tôi quay lại khách hàng, tôi cũng không tìm cách tạo các ứng dụng khách hàng tiềm năng miền tại đây.

3) Liên kết tiêu đề - Tôi thực sự thích ý tưởng này, nhưng tôi không nghĩ nó sẽ hoạt động (bởi chính nó) vì đôi khi tài nguyên của chúng tôi chứa các bộ sưu tập tài nguyên phụ. Trong trường hợp này, các tài nguyên con sẽ vẫn phải được trộn vào XML chứa các liên kết/href, vv Vì vậy, trong khi các tiêu đề liên kết giải quyết vấn đề cho loại cấp cao nhất, nó không giải quyết toàn bộ vấn đề. Hãy nói khác đi!

Có cách tiếp cận nào khác sẽ giúp tôi tránh các DTO và vẫn minh bạch với mô hình miền không?

+0

Thêm liên kết vào mô hình yêu cầu mở rộng các lớp miền của bạn nhưng sau đó lớp DAO của bạn không thể khởi tạo các đối tượng đó. Xem xét tổng hợp và thêm JAXB (hoặc bất kỳ ánh xạ XML nào) vào lớp đó. –

+0

Nếu tôi hiểu, hãy tạo một mô hình REST tổng hợp các đối tượng miền với các liên kết và gửi nó qua. Loại giống như DTO, nhưng giống như mở rộng tên miền để bao gồm các liên kết. Tôi hiểu không? – HDave

+2

Có, tôi sẽ tạo trình bao bọc. Nếu cần, hãy ủy thác các cuộc gọi đến các đối tượng DAO. Về cơ bản, đó là [mẫu thiết kế trang trí] (http://en.wikipedia.org/wiki/Decorator_pattern). –

Trả lời

2

Vấn đề là tạo chính xác các liên kết đòi hỏi phải biết bối cảnh mà chúng đang được tạo ra, điều này có nghĩa là các trình chặn đánh chặn JAXB đơn giản sẽ không thực hiện công việc: chúng đơn giản sẽ không biết URL cần chèn. Hơn nữa, tạo ra các liên kết tiếp theo và trước đó sẽ yêu cầu biết những giá trị đó là gì; có thể không an toàn để nói rằng chúng liên tiếp, vì điều đó sẽ ngụ ý một tài nguyên thay đổi URL của nó khi một số tài nguyên khác bị xóa, điều này sẽ là điên rồ.

Phương thức an toàn nhất, dễ nhất sẽ là lớp bao bọc (với chú thích tuần tự hóa JAXB trên đó) đại diện cho lớp DAO cho thông tin cần thiết. Trong khi điều này có thể là một số tiền hợp lý của mã để viết, nó ít nhất là dễ dàng để có được mã như vậy ngay. Fancy trang trí tự động sẽ khó khăn hơn nhiều.

0

RESTEasy có hỗ trợ liên kết thông qua liên kết nguyên tử hoặc tiêu đề. Có một số chú thích bổ sung mà bạn có thể chỉ các dịch vụ được liên kết. Xem chương 8 của tài liệu RESTEasy.

Các vấn đề liên quan