Tôi sử dụng Apache CXF 2.4.2 và khi tôi trả về một số đối tượng từ cơ sở dữ liệu cho người dùng, tôi muốn loại trừ một số thuộc tính (ví dụ, mật khẩu). Làm thế nào tôi có thể làm điều đó mà không cần tạo ra lớp học tạm thời? Có chú thích cho điều này không?CXF: cách loại trừ một số thuộc tính khi đối tượng được gửi qua SOAP?
Trả lời
Theo nhận xét @ tomasz-nurkiewicz tôi nên sử dụng chú thích @XmlTransient
. Nhưng như đã nêu trong tài liệu hướng dẫn
Theo mặc định, nếu @XmlAccessorType trên một lớp vắng mặt, và không ai trong số các lớp siêu của nó được chú thích với @XmlAccessorType, sau đó mặc định sau trên lớp được giả:
@ XmlAccessorType (XmlAccessType.PUBLIC_MEMBER)
đâu XmlAccessType.PUBLIC_MEMBER
có nghĩa là:
mỗi getter công cộng/cặp setter và mỗi pu trường blic sẽ tự động được liên kết với XML, trừ khi được chú thích bởi XmlTransient. Các trường hoặc các cặp getter/setter được riêng tư, được bảo vệ hoặc được mặc định thành truy cập chỉ gói chỉ được ràng buộc với XML khi chúng được chú thích một cách rõ ràng bằng các chú thích JAXB thích hợp.
Vì vậy, đây là lý do tại sao @XmlTransient
cho trường riêng tư không hoạt động trong ví dụ từ Tomasz Nurkiewicz. Có hai cách có thể khắc phục điều đó:
1) Thêm chú thích để getter công cộng:
private String password;
@XmlTransient
public String getPassword() {
return password;
}
2) Thêm @XmlAccessorType
đến lớp:
@XmlAccessorType(XmlAccessType.FIELD)
public User {
@XmlTransient
private String password;
}
Tìm thấy tại: http://old.nabble.com/@XmlTransient-ignored-td7406659.html
Tôi cho rằng bạn đang sử dụng JAXB cho ánh xạ đối tượng-XML. Trong trường hợp đó chỉ cần chú thích các trường bạn muốn bỏ qua trong thực thể cơ sở dữ liệu của bạn với @XmlTransient
.
@XmlTransient
private String password;
Tuy nhiên lưu ý rằng một ngày nào đó bạn sẽ nhận ra rằng bạn không cần một lớp học tạm thời chủ yếu để tách dịch vụ web CXF của bạn từ backend. Sau khi tất cả các bạn không muốn nhớ tất cả thời gian mà thêm một cột trong cơ sở dữ liệu ngay lập tức phá vỡ giao diện SOAP ...
tôi Tôi không chắc chắn những gì tôi sử dụng, bởi vì tôi đã chỉ thêm 'cxf-rt-frontend-jaxws' và' cxf-rt-transports-http' vào tệp 'pom.xml' của tôi để sử dụng CXF. Nhưng tôi thấy 'jaxb-impl-2.1.13.jar' và' cxf-rt-databinding-jaxb-2.4.3.jar' trong gói WAR của tôi, có vẻ như bạn đã đúng. Tôi đã cố gắng sử dụng '@ XmlTransient' mà không may mắn: (Tôi cũng đã thêm' @ XmlRootElement' vào cả lớp, nhưng không có gì thay đổi. Bạn có mẹo khác không? –
Xin chào một lần nữa! Tôi googling và làm ít nghiên cứu và tìm ra cách giải quyết vấn đề của mình Xem bản cập nhật của tôi Tôi cũng đưa ra câu trả lời của bạn vì nó giúp tôi tìm ra giải pháp phù hợp. –