Để xử lý các phiên bản nội dung khác nhau, tôi đang cố sử dụng các tham số chấp nhận của tiêu đề "Chấp nhận *" (RFC 2616).Cách xử lý thông số chấp nhận khi phát triển ứng dụng jax-rs
Accept: application/vnd.mycompany.mytype;version=2 , application/vnd.mycompany.mytype;version=1;q=0.1
Vấn đề là Jax-RS chú thích không hỗ trợ Accept-thông số ...
@GET
@Produces("application/vnd.test;version=1")
public Response test1() {
return Response.ok("Version 1", "application/vnd.test").build();
}
@GET
@Produces("application/vnd.test;version=2")
public Response test2() {
return Response.ok("Version 2", "application/vnd.test").build();
}
Kết quả trong một ngoại lệ phương tiện truyền thông loại mâu thuẫn:
Producing media type conflict. The resource methods public javax.ws.rs.core.Response test.resources.TestResource.test2() and public javax.ws.rs.core.Response test.resources.TestResource.test1() can produce the same media type
Có lẽ, ngoại lệ này chỉ liên quan đến khung JAX-RS của tôi (Jersey), nhưng tôi sợ điều này là do JSR311 không rõ ràng về các tham số chấp nhận.
Hiện tại, tôi đang sử dụng các loại nội dung chứa phiên bản bên trong tên của chúng, nhưng tôi thấy giải pháp này khá uggly.
@GET
@Produces("application/vnd.test-v1")
public Response test() {
return Response.ok("Version 1", "application/vnd.test-v1").build();
}
Bạn có ý tưởng nào về cách xử lý thông số chấp nhận không?
EDIT
Tôi nghĩ rằng tôi đã không đủ rõ ràng. Tôi muốn tự động định tuyến yêu cầu đến các phương pháp cụ thể. Các phương thức này được phiên bản và tương ứng với phiên bản cụ thể của kiểu nội dung trả về. Thực thi hiện tại JAX-RS ngăn tôi sử dụng các tham số chấp nhận để định tuyến yêu cầu (đến phương thức tương ứng).
greenkode đề xuất rằng tôi quản lý thông số chấp nhận version
trong phương thức gửi đi (sử dụng @HeaderParam("Accept")
). Giải pháp này sẽ kết thúc bằng cách viết lại logic phân ly nội dung được nhúng trong khung công tác (và được mô tả trong JSR 311).
Tôi có thể làm gì để sử dụng cả logic chấp nhận tham số và nội dung-phân ly từ JAX-RS?
Có thể giải pháp là sử dụng một khung công tác khác (Tôi chỉ làm việc với Jersey theo Hiện hành). Nhưng tôi không biết cái nào.
Bây giờ điều đó thật thú vị. Đọc nhận xét, tôi thấy rằng JAX-RS không có vấn đề gì khi diễn tả điều này. Thay vào đó, nó là một vấn đề với việc thực hiện * Jersey *, và rằng ít nhất một triển khai khác có thể thực hiện nó. (Tôi muốn tôi biết liệu CXF, khung tôi sử dụng, có vấn đề ở đây, nhưng tôi đang trên đường ngay bây giờ và không thể kiểm tra ...) –
Bất kỳ cập nhật nào về cách bạn chọn triển khai. Tôi cần phải làm như vậy và tò mò muốn biết nếu hte chọn câu trả lời đã làm việc cho bạn. –