2011-10-14 44 views
12

Chúng ta có một ứng dụng java lớn hoàn toàn hoạt động dựa trên máy chủ trung gian JAXB. Máy chủ trung gian thực hiện tất cả truy cập db và gửi tất cả các đối tượng dữ liệu trong đối tượng JAXB và serializes tới XML và gửi dữ liệu đến giao diện người dùng (Cnet).Đối tượng JAXB - hashcode và bằng

Hầu hết các lần sau khi dữ liệu được điền từ truy cập db vào đối tượng java JAXB, tôi sẽ phải xử lý như "sắp xếp bộ sưu tập đối tượng dựa trên thuộc tính", tìm avg, thực hiện một số tính toán trong danh sách đối tượng trong bộ sưu tập, v.v.

Vấn đề chính của tôi là, đối tượng JAXB không có bằng và mã băm. Vì vậy, những gì tôi đang làm là di chuyển tất cả dữ liệu đến một số đối tượng Dữ liệu do người dùng xác định nơi tôi có hashcode, equals, compareTo được định nghĩa để tôi có thể thực hiện tất cả các hoạt động trong các bộ sưu tập và sau đó sao chép vào các đối tượng JAXB. Tôi nghĩ rằng đây là một chi phí phụ.

Câu hỏi:

1) các đối tượng jaxb có hỗ trợ bằng/hashcode/compareTo - tôi có thể chỉ định các giản đồ này không?

2) Bất kỳ phương án thay thế nào khác tốt hơn?

Cảm ơn.

Trả lời

10

không may, jaxb không cung cấp điều này ra khỏi hộp. bạn có thể sử dụng this plugin hoặc viết của riêng bạn để có hành vi tùy chỉnh hơn.

+0

+1 để giới thiệu plugin này. Tôi sẽ cho nó nó một cơ hội. –

+1

plugin đã thay đổi vị trí: https://github.com/highsource/maven-jaxb2-plugin/wiki/Using-JAXB-Plugins – WhiteKnight

+0

@WhiteKnight được cập nhật, cảm ơn – jtahlborn

3

Có vẻ như bạn cần sử dụng Collections.sort(list, Comparable) để hoàn thành việc sắp xếp mà bạn muốn. Bằng và hashcode sẽ không giúp ích gì cho các trường hợp bạn đã đề cập vì các trường hợp của bạn dựa vào so sánh các thuộc tính cụ thể, không phải đối tượng nói chung.

Các trường hợp tìm kiếm trung bình và tính toán khác cũng không liên quan gì đến bằng/hashcode mà tôi có thể thấy. Các hoạt động này chỉ đơn giản là yêu cầu phân tích cú pháp các danh sách và thực hiện thuật toán thích hợp của bạn.

+0

Đây là một ý tưởng tốt để thay thế compareTo. Nhưng vấn đề của tôi không chỉ là phân loại. Tôi làm tất cả các loại xử lý như xây dựng một cây lồng nhau của các đối tượng này, nơi tôi cần phải đặt chúng trong hashmap vv Tôi cần phải có workaround cho hashcode và bằng là tốt; –

+0

Đây là một kịch bản khác với câu hỏi thực tế của bạn. Bạn cũng sẽ phải xác định thêm các yêu cầu cho cây lồng nhau của bạn để giải thích sự cần thiết phải ghi đè bằng/hashcode. Cho đến nay bạn đang nói rằng bạn cần phải ghi đè lên, nhưng không đưa ra bất kỳ lý do chính đáng nào. – Robin

2

FWIW, trong khi các lớp Java được tạo bởi JAXB sẽ không có bằng và hashcode, bạn có thể thêm các ghi đè này trong các lớp bạn viết với chú thích JAXB - JAXB sẽ bỏ qua các phương thức.

+0

+1 đó là một điểm tốt. sẽ thử với chú thích. –

+1

Tôi có thể không rõ ràng- Tôi có nghĩa là các lớp học có chú thích cũng có thể có bằng và hashcode, không phải bằng và hashcode có thể được thêm bằng chú thích. –

0

maven-jaxb2-plugin có thể tạo phương thức băm và bằng bằng cách sử dụng plugin của riêng nó: org.jvnet.jaxb2_commons. Bạn có thể tìm thấy thêm chi tiết về cấu hình here.

Các bộ phận có liên quan của pom.xml như sau:

<project 
    <!-- other configuration --> 
    <dependencies> 
    <!-- other dependencies --> 
    <dependency> 
     <groupId>org.jvnet.jaxb2_commons</groupId> 
     <artifactId>jaxb2-basics</artifactId> 
     <version>0.11.0</version> 
    </dependency> 
    </dependencies> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.jvnet.jaxb2.maven2</groupId> 
     <artifactId>maven-jaxb2-plugin</artifactId> 
     <version>0.13.1</version> 
     <executions> 
      <execution> 
      <id>generate</id> 
      <goals> 
       <goal>generate</goal> 
      </goals> 
      </execution> 
     </executions> 
     <configuration> 
      <args> 
      <arg>-XtoString</arg> 
      <arg>-Xequals</arg> 
      <arg>-XhashCode</arg> 
      </args> 
      <plugins> 
      <plugin> 
       <groupId>org.jvnet.jaxb2_commons</groupId> 
       <artifactId>jaxb2-basics</artifactId> 
       <version>0.11.0</version> 
      </plugin> 
      </plugins> 
      <schemaDirectory>${project.basedir}/src/main/resources</schemaDirectory> 
      <cleanPackageDirectories>true</cleanPackageDirectories> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
</project> 
Các vấn đề liên quan