2009-05-04 40 views
7

Tôi có một ứng dụng Java \ mùa xuân \ Hibernate - hoàn chỉnh với các lớp miền mà về cơ bản Hibernate POJOSử dụng lớp java trong Grails

Có một mảnh chức năng mà tôi nghĩ rằng có thể được viết tốt trong Grails.

Tôi muốn sử dụng lại các lớp miền mà tôi đã tạo trong ứng dụng Java chính

Cách tốt nhất để làm như vậy là gì?

Tôi có nên viết các lớp miền mới mở rộng các lớp Java không? điều này nghe có vẻ khó hiểu Hoặc tôi có thể 'tạo' các bộ điều khiển khỏi các lớp miền Java không?

thực tiễn tốt nhất xung quanh tái sử dụng đối tượng miền Java trong Grails \ Groovy là gì tôi chắc chắn phải có người khác viết một số tác phẩm trong grails \ groovy

Nếu bạn biết về một hướng dẫn mà nói về như một integration- điêu đo thật tuyệt vơi !!!

PS: Tôi khá là một người mới trong grails-groovy vì vậy có thể bị thiếu rõ ràng. Cảm ơn !!!

Trả lời

4

Bạn có thực sự muốn/cần sử dụng Grails thay vì chỉ Groovy không?

Grails thực sự không phải là thứ bạn có thể sử dụng để thêm một phần vào ứng dụng web hiện có. Toàn bộ cách tiếp cận "quy ước về cấu hình" có nghĩa là bạn phải chơi khá nhiều bởi các quy tắc của Grails, nếu không thì không có vấn đề gì khi sử dụng nó. Và một trong những quy tắc đó là các đối tượng miền là các lớp Groovy được rất nhiều "nâng cao" bởi thời gian chạy Grails. Có thể có họ mở rộng các lớp Java hiện có, nhưng tôi sẽ không đặt cược vào nó - và tất cả các phần Spring và Hibernate của ứng dụng hiện tại của bạn sẽ phải bị loại bỏ, hoặc ít nhất bạn phải dành rất nhiều nỗ lực để làm cho họ làm việc trong Grails. Bạn sẽ chiến đấu với khung chứ không phải là thu lợi từ nó.

IMO bạn có hai lựa chọn:

  • Viết lại ứng dụng của bạn từ đầu trong Grails khi tái sử dụng càng nhiều các mã hiện càng tốt.
  • Giữ ứng dụng của bạn như hiện tại và thêm nội dung mới trong Groovy, mà không cần sử dụng Grails.

Trường hợp sau có thể tốt hơn trong trường hợp của bạn. Grails có nghĩa là tạo ra các ứng dụng web mới rất nhanh chóng, đó là nơi nó tỏa sáng. Thêm nội dung vào ứng dụng hiện tại không phải là thứ được tạo ra.

EDIT: Liên quan đến việc làm rõ trong các ý kiến: nếu bạn đang lập kế hoạch để viết về cơ bản một mục dữ liệu/bảo trì frontend cho dữ liệu được sử dụng bởi ứng dụng khác và có DB là kênh giao tiếp duy nhất giữa họ, sức mạnh đó thực sự làm việc khá tốt với Grails; nó chắc chắn có thể được cấu hình để sử dụng một lược đồ DB hiện có hơn là tạo lược đồ riêng của nó từ các lớp miền (mặc dù sau này là ít công việc hơn).

+0

Cảm ơn - những gì bạn nói có ý nghĩa Làm rõ với Q của tôi ... Tiện ích bổ sung mà tôi đang nói sẽ tồn tại dưới dạng một ứng dụng riêng biệt. Về cơ bản nó sẽ làm 'CRUD' cho các đối tượng được 'xử lý' bởi ứng dụng chính. Ở mức tối thiểu - chúng sẽ chỉ chia sẻ mô hình Dữ liệu và nếu tôi cũng may mắn với các đối tượng miền Java. Tôi không có ý định hoặc cần phải tái sử dụng thêm. –

+0

Bạn có nhiều kinh nghiệm với Grails không? – willcodejavaforfood

+0

@willcodejavaforfood: Tôi sẽ không nói "nhiều" - về cơ bản là giá trị của một dự án. –

19

Hiểu rõ Groovy và Grails nổi trội khi tích hợp với mã Java hiện tại, tôi nghĩ tôi có thể lạc quan hơn Michael một chút về các lựa chọn của bạn.

Điều đầu tiên là bạn đã sử dụng Spring và Hibernate và vì các lớp miền của bạn đã là POJO nên chúng dễ dàng tích hợp với. Bất kỳ bean Spring nào bạn có thể có thể được chỉ định trong một tệp XML như bình thường (trong grails-app/conf/spring/resources.xml) hoặc nhiều hơn nữa chỉ đơn giản là sử dụng tính năng Spring bean builder của Grails. Sau đó, họ có thể được truy cập theo tên trong bất kỳ bộ điều khiển, xem, dịch vụ, vv và làm việc như bình thường.

Dưới đây là các tùy chọn, như tôi đã nhìn thấy chúng, cho việc tích hợp các lớp miền của bạn và giản đồ cơ sở dữ liệu:

  • Bypass GORM và tải/lưu tên miền của bạn đối tượng chính xác như bạn đã làm.

    Grails không bắt buộc bạn sử dụng GORM, vì vậy điều này khá đơn giản: tạo .jar mã Java của bạn (nếu bạn chưa có) và thả nó vào thư mục lib của ứng dụng Grails. Nếu dự án Java của bạn là Mavenized, nó thậm chí còn dễ dàng hơn: Grails 1.1 làm việc với Maven, vì vậy bạn có thể tạo một pom.xml cho ứng dụng Grails của bạn và thêm dự án Java của bạn như một phụ thuộc như bạn làm trong bất kỳ dự án Java nào khác.

    Dù bằng cách nào bạn cũng có thể import các lớp học của mình (và bất kỳ lớp hỗ trợ nào) và tiếp tục như bình thường. Do sự tích hợp chặt chẽ của Groovy với Java, bạn sẽ có thể tạo các đối tượng, tải chúng từ cơ sở dữ liệu, sửa đổi chúng, lưu chúng, xác nhận chúng chính xác như bạn làm trong dự án Java của bạn. Bạn sẽ không nhận được tất cả các tiện ích của GORM theo cách này, nhưng bạn sẽ có lợi thế khi làm việc với các đối tượng của bạn theo cách đã có ý nghĩa với bạn (ngoại trừ có thể với một chút ít mã nhờ Groovy). Bạn luôn có thể thử tùy chọn này trước tiên để có được một cái gì đó làm việc, sau đó xem xét một trong các tùy chọn khác sau này nếu nó có vẻ có ý nghĩa tại thời điểm đó.

    Một mẹo nếu bạn thử tùy chọn này: trừu tượng mã lưu giữ thực tế thành dịch vụ Grails (StorageService có lẽ) và yêu cầu các trình điều khiển gọi phương thức thay vì xử lý sự kiên trì trực tiếp. Bằng cách này, bạn có thể thay thế dịch vụ đó bằng một thứ khác trên đường nếu cần và miễn là bạn duy trì cùng một giao diện, bộ điều khiển của bạn sẽ không bị ảnh hưởng.

  • Tạo các lớp miền Grails mới làm lớp con của các lớp Java hiện có của bạn.

    Điều này có thể khá đơn giản nếu các lớp học của bạn đã được viết thành các hạt thích hợp, tức là với các phương thức getter/setter cho tất cả các thuộc tính của chúng. Grails sẽ thấy các thuộc tính kế thừa này nếu nó được viết theo kiểu Groovy đơn giản hơn. Bạn sẽ có thể chỉ định cách xác nhận hợp lệ từng thuộc tính, bằng cách sử dụng kiểm tra xác nhận đơn giản (không rỗng, không trống, vv) hoặc với các bao đóng làm những việc phức tạp hơn, có thể gọi các phương thức hiện có trong các lớp siêu lớp POJO của chúng.

    Bạn gần như chắc chắn sẽ cần tinh chỉnh ánh xạ qua GORM mapping DSL để phù hợp với thực tế của lược đồ cơ sở dữ liệu hiện có của bạn. Mối quan hệ sẽ là nơi nó có thể trở nên phức tạp. Ví dụ, bạn có thể có một số giải pháp khác mà GORM mong đợi một bảng kết nối, mặc dù thậm chí có thể có một cách để làm việc xung quanh các khác biệt như vậy. Tôi khuyên bạn nên học càng nhiều càng tốt về GORM và bản đồ DSL của nó và sau đó thử nghiệm với một vài lớp học của bạn để xem đây có phải là một lựa chọn khả thi hay không.

  • Có Grails sử dụng ánh xạ POJO và Hibernate hiện có của bạn trực tiếp.

    Tôi chưa thử điều này, nhưng theo Grails's Hibernate Integration page điều này được cho là có thể: "Grails cũng cho phép bạn viết mô hình miền của bạn bằng Java hoặc tái sử dụng mô hình miền hiện có đã được ánh xạ bằng Hibernate .Tất cả những gì bạn phải làm là đặt tệp 'hibernate.cfg.xml' cần thiết và các tệp ánh xạ tương ứng vào thư mục '% PROJECT_HOME%/grails-app/conf/hibernate'. Bạn sẽ vẫn có thể gọi tất cả các phương pháp truy vấn và liên tục động được phép trong GORM! "

    " di sản gorm "của Googling sẽ đưa ra một số cuộc thảo luận và ví dụ hữu ích, ví dụ: this blog post bởi Glen Smith (đồng tác giả của ngay sau khi được phát hành Grails in Action), nơi anh ấy hiển thị một tệp ánh xạ Hibernate được sử dụng để tích hợp với "DB kế thừa từ Địa ngục" Grails in Action có một tiêu đề có tên "Advanced GORM Kungfu" Tôi có một bản PDF trước khi phát hành, và trong khi tôi chưa đến chương đó, những gì tôi đã đọc cho đến nay rất tốt, và cuốn sách bao gồm nhiều chủ đề không được thảo luận đầy đủ trong các sách Grails khác.

Rất tiếc, tôi không thể cung cấp bất kỳ trải nghiệm cá nhân nào về tùy chọn cuối cùng này, nhưng có vẻ khả thi (và khá hứa hẹn). Cho dù bạn chọn tùy chọn nào, hãy cho chúng tôi biết cách tùy chọn của bạn!

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