2010-07-23 13 views
5

Tôi muốn biết làm thế nào tôi có thể làm cho trình biên dịch JAXB làm cho các phần tử nhất định trong lược đồ XML của tôi được khai báo là cuối cùng trong định nghĩa lớp java và tôi cũng muốn có khả năng điều khiển các hàm tạo khác nhau, như trong Tôi muốn một nhà xây dựng có thể tạo đối tượng với một danh sách đầy đủ các tham số chứa trong lớp cũng như hàm tạo riêng mặc định cần thiết bởi JAXB.JAXB constructor injection

Bất kỳ trợ giúp nào?

Cảm ơn.

Dưới đây là một ví dụ về những gì tôi đang cố gắng để làm:

<xs:complexType name="mycomplex"> 
    <xs:all> 
     <xs:element name="myboolean" type="xs:boolean"/> 
    </xs:all> 
</xs:complexType> 

bây giờ mã được tạo ra sẽ giống như thế

public class mycomplex 
{ 
     protected boolean myboolean; 

     public boolean getMyboolean() { return myboolean; } 
     public void setMyboolean(boolean b) { this.myboolean = b; } 
} 

nhưng tôi muốn chỉnh sửa lược đồ để làm cho nó trông như:

public class mycomplex 
{ 
     protected final boolean myboolean; 

     public mycomplex(boolean b) { this.myboolean = b; } 

     public boolean getMyboolean() { return myboolean; } 
} 

Điều này có thể đạt được không?

+0

Xin vui lòng cho chúng tôi ví dụ, trong đó có các loại đồ các thành phần mà bạn đang nói đến và cách bạn muốn chúng được thể hiện trong java. – skaffman

+0

bài đăng gốc đã được chỉnh sửa. là nó có thể? – ExtremeCoder

+0

Tôi không nghĩ đó là, không. Theo hiểu biết của tôi, tiêm xây dựng không bao giờ được thêm vào JAXB2, mặc dù tôi nghĩ rằng nó đã được lên kế hoạch tại một thời điểm. – skaffman

Trả lời

0

Tôi đã giải quyết vấn đề này theo một cách khác. Tôi đang tạo một công cụ sẽ chỉnh sửa các tệp mã nguồn java được tạo và sẽ thêm vào/xóa những gì tôi cần. Tham khảo này để biết thêm thông tin: Using the Eclipse AST

0

Không có cách JAXB chuẩn để tạo lớp giống như vậy, vì đặc tả JAXB không hỗ trợ ánh xạ tới lớp như thế.

Bạn có thể sử dụng mã sau để tránh có phương pháp đã đặt. Bạn có thể thêm các hàm tạo bổ sung nếu bạn muốn miễn là có một hàm mặc định công khai.

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class mycomplex  
{  
     protected final boolean myboolean;  

     public boolean getMyboolean() { return myboolean; }  
}  

Nếu bạn muốn sử dụng lớp mà bạn mô tả ở trên với một constructor không mặc định và một lĩnh vực được đánh dấu cuối cùng bạn sẽ cần phải tạo ra một XmlAdapter:

+0

Cảm ơn bạn rất nhiều vì điều này nhưng nó không hoàn toàn là những gì tôi tìm kiếm. Tôi sẽ unmarshalling hàng trăm lớp học, có nghĩa là làm một cái gì đó như thế này sẽ được khá tẻ nhạt như tôi phải xác định tất cả mọi thứ bản thân mình và các lớp học tất cả sẽ thay đổi theo thời gian -> rất tốn thời gian nếu tôi phải xác định lại mọi thứ mọi lúc. Có cách nào để chứa loại hành vi này trong một quy trình tự động hơn trên hàng trăm lớp khác nhau không? Cảm ơn bạn lần nữa. – ExtremeCoder

+0

@BlaiseDoughan mọi cơ hội bạn sẽ thêm http://docs.oracle.com/javase/6/docs/api/java/beans/ConstructorProperties.html vào Moxy của bạn? –

+0

@AdamGent - Bạn có nhớ cung cấp điều này làm nhận xét về yêu cầu nâng cao sau không ?: http://bugs.eclipse.org/328951 –