2010-01-11 6 views
6

Tôi là một newbie grails (và một newbie groovy), và tôi đang làm việc thông qua một số hướng dẫn grails. Là một người dùng mới, vỏ grails là một công cụ nhỏ thực sự hữu ích đối với tôi, nhưng tôi không thể tìm ra cách làm cho nó thấy các lớp và các đối tượng của tôi. Đây là những gì tôi đang cố gắng:Grails shell không nhìn thấy các đối tượng miền

% grails create-app test 
% cd test 
% grails create-domain-class com.test.TestObj 
% grails shell 
groovy:000> new TestObj() 
ERROR org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed, groovysh_evaluate: 2: unable to resolve class TestObj 

Tôi đã ấn tượng rằng vỏ grails có thể thấy tất cả các bộ điều khiển, dịch vụ và đối tượng miền. Chuyện gì thế này? Tôi có cần làm gì khác ở đây không?

tôi đã cố gắng một điều khác:

groovy:000> foo = new com.test.TestObj(); 
===> com.test.TestObj : null 
groovy:000> foo.save 
ERROR groovy.lang.MissingPropertyException: No such property: save for class: com.test.TestObj 

Tôi đang làm gì sai?

EDIT: OK, tôi đã thấy câu trả lời về cách sử dụng tên đầy đủ và cũng có thể sử dụng .save() thay vì .save. Nhưng còn cái này thì sao?

groovy:000> new com.test.TestObj().save() 
ERROR org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 

Tôi làm gì sai lần này?

Trả lời

2

Tôi là lời khuyên thứ hai của Burt khi sử dụng bảng điều khiển thay vì vỏ. Về ngoại lệ:

groovy:000> new com.test.TestObj().save() 
ERROR org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 

Bạn có thể thử chạy một cách rõ ràng mã này với một giao dịch:

import com.test.TestObj 

TestObj.withTransaction{ status -> 
    TestObj().save() 
} 
+0

Có, withTransaction hoạt động hoàn hảo. Tôi tự hỏi tại sao tôi cần phải thêm điều đó. Ví dụ trực tuyến dường như không đề cập đến nó. –

+0

Bạn không cần phải thêm điều đó, nhưng tôi nghĩ rằng nó có thể giải quyết vấn đề của bạn. Bằng cách chạy mã của bạn trong một giao dịch, bạn buộc phải tạo ra một phiên ngủ đông (nếu thiếu). –

2

Bạn cần gói vì có thể (nhưng không phải là ý tưởng hay) để có hai lớp miền có cùng tên trong các gói khác nhau.

Đối với phiên thứ 2, nó phải là foo.save(), không phải foo.save.

Tôi thích bảng điều khiển, việc này dễ dàng hơn nhiều. Chạy 'grails console' và ứng dụng Swing sẽ bắt đầu. Nó hơi khác một chút so với giao diện điều khiển Groovy thông thường ở chỗ nó có một biến 'ctx' ẩn tiềm ẩn, đó là ngữ cảnh ứng dụng Spring. Bạn có thể sử dụng dịch vụ đó để truy cập dịch vụ và các hạt Spring khác qua "ctx.getBean ('fooService')"

+0

Cảm ơn, lời khuyên tốt! P.S. Tôi có một câu hỏi nữa, save() tạo ra một ngoại lệ Hibernate. Gợi ý? –

+0

Ngoài ra, "ctx" dường như cũng có sẵn trong trình bao của tôi. Có lẽ họ đã thêm nó vào 1.2? –

1

bạn sẽ phải import com.test.TestObj hoặc tham chiếu nó theo new com.test.TestObj() như bạn đã hiển thị.

Lưu ý rằng 'save' không phải là một cách thích hợp mà là một phương thức năng động mà Grails trang trí lớp miền với thời gian chạy.

groovy:000> foo = new com.test.TestObj(); 
===> com.test.TestObj : null 
groovy:000> foo.save() 
===> com.test.TestObj : 2 
groovy:000> 
+1

Ahhh, tôi biết rằng tiết kiệm là một phương pháp, nhưng tôi mới đủ để groovy không biết rằng tôi không thể gọi một phương pháp mà không có dấu ngoặc đơn :) Bạn có biết điều gì với ngoại lệ phiên Hibernate tôi thấy hiện nay? –