2012-06-26 40 views
17

Tôi muốn tạo ra một đa mô-đun (maven) mùa xuân ứng dụng MVC, với các module như:Làm thế nào để sử dụng hiệu quả Scala trong một dự án Spring MVC?

web 
persistance (hibernate) 
core (general libs) 
models 
job-server (queue based jobs) 
services (business logic) 

Bây giờ sử dụng Scala trong dự án này, tôi có thể viết scala ở khắp mọi nơi mà không cần bất kỳ vấn đề? Hoặc tôi có nên sử dụng scala cho mô-đun dịch vụ của tôi và java cho mô-đun web không?

Tôi biết ngủ đông sẽ phải ở dạng java.

Suy nghĩ? Khuyên bảo?

Có bất kỳ vấn đề nào cần tìm không? Đây có phải là một ý tưởng tốt? Tôi có phải hack một số phần để dán chúng lại với nhau không?

+0

Lời khuyên của tôi: "không". ;) –

Trả lời

16

Có, bạn có thể sử dụng Scala cho cả mã Spring MVC và các lớp Hibernate của bạn.

Dưới đây là một ví dụ về một MVC Controller mùa xuân trong Scala lấy từ một trong những dự án của tôi:

@Controller 
class HomeController { 
    val log: Logger = LoggerFactory.getLogger(this.getClass.getName) 

    @RequestMapping(Array("/")) 
    def home: String = { 
    log.debug("HomeController::home") 

    "home/home" 
    } 
} 

Và một ví dụ về một lớp học miền Hibernate. Lưu ý việc sử dụng các lớp bộ sưu tập Java riêng cho Hibernate được điều chỉnh bởi các lớp thu gom Scala công cộng cho người dùng của lớp (được hỗ trợ bởi lớp JavaConversions của Scala).

@Entity 
class Role { 
    @Id @GeneratedValue 
    var id: Long = _ 

    @Index(name="role_name") 
    var name: String = _ 

    var created_at: Date = _ 
    var updated_at: Date = _ 

    @ManyToMany 
    private var sub_role: java.util.Set[Role] = _ 
    def subRoles: Set[Role] = { 
    if (sub_role == null) sub_role = new java.util.HashSet[Role] 
    sub_role 
    } 

    @ManyToMany 
    private var permission: java.util.Set[Permission] = _ 
    def permissions: Set[Permission] = { 
    if (permission == null) permission = new java.util.HashSet[Permission] 
    permission 
    } 
} 

Điều duy nhất tôi đã thấy rằng tôi đã sử dụng Java cho được viết @Retention(RUNTIME) chú thích (đối với JSR-303 kiểm chứng thực).

Tôi sử dụng Maven và plugin maven-scala với các dự án Java/Scala hỗn hợp.

+0

Có hướng dẫn về cách sử dụng scala và Spring không? Có, chúng tôi có thể sử dụng Spring với scala, nhưng những gì về sắc thái? – Cherry

+0

Những gì ... xin vui lòng không viết mã Scala như thế này. Không bao giờ. :( –

+1

Bạn có thể cụ thể hơn không? Làm thế nào để viết mã Hibernate trong Scala? – sourcedelica

3

Bạn có thể sử dụng scala & java với nhau cho bất cứ điều gì bạn nghĩ rằng mỗi công trình tốt nhất cho.

Tôi biết ngủ đông sẽ phải ở dạng java.

Điều này không nhất thiết phải đúng. Bạn có thể sử dụng các lớp scala làm đối tượng Hibernate ORM. Bạn chỉ cần đảm bảo rằng các tệp .class được biên dịch kết thúc với cùng một getters, setters và hàm tạo mặc định mà Hibernate mong đợi.

Ngay cả mô-đun ứng dụng web của bạn cũng có thể được viết bằng scala. Các bộ điều khiển chỉ cần tuân theo hợp đồng mà Spring MVC mong đợi.

Nói chung, hầu hết mọi thứ được viết bằng Java đều có thể được viết lại bằng scala. Của thô có ngoại lệ nhưng không per-maturaly giới hạn mình từ cố gắng. Giả sử mã hiện tại của bạn không làm bất cứ điều gì để phát điên (tức là phản chiếu ma thuật đen), nó sẽ ổn thôi.

Câu hỏi thú vị ở đây là làm thế nào để có được nó làm việc với Maven ...

Có một existing SO question trong đó mô tả cách sử dụng maven-scala-plugin để có được loại này của dự án làm việc (đa mô-đun với nguồn scala và java hỗn hợp) . Chỉ có thêm bình luận tôi sẽ thêm vào giải pháp này là, theo kinh nghiệm của tôi, chúng tôi chỉ có thể làm cho nó làm việc với các mô-đun scala đang phụ thuộc vào nguồn java, không phải là cách khác xung quanh. Điều này là do cấu hình maven của chúng tôi đã sử dụng trình biên dịch java và trình biên dịch scala một cách riêng biệt. Về lý thuyết, trình biên dịch scala có thể biên dịch các tệp Java vì vậy nếu bạn cấu hình nó để chỉ sử dụng một trình biên dịch cho mọi thứ, bạn sẽ không gặp phải giới hạn này.

EDIT:

Blankman nhận xét:
@Jesse vì vậy bạn đã làm điều này cũng sau đó? không chắc tôi hiểu vấn đề maven.

Có, tôi đã làm việc trên một vài dự án đã sử dụng nguồn hỗn hợp java và scala. Chúng tôi đã không sử dụng Scala cho lớp Hibernate nhưng chúng tôi đã làm cho mọi thứ khác.

Vấn đề về maven mà tôi mô tả là hậu quả của cấu hình plugin maven-scala-plugin của chúng tôi. Bạn phải cấu hình nó để biết cách biên dịch các tệp scala của bạn. Cấu hình của chúng tôi (có thể không chính xác) được thiết lập để biên dịch các tệp java trước, bằng cách sử dụng javac, sau đó biên dịch các tệp scala, sử dụng scalac.Điều này có nghĩa là chúng tôi không được phép viết mã java tham chiếu các lớp scala vì chúng sẽ không có sẵn vào thời gian biên dịch. Với cấu hình thích hợp, bạn có thể sử dụng trình biên dịch scalac để biên dịch tất cả các nguồn của bạn với nhau, điều này sẽ loại bỏ hạn chế khó xử này. Câu hỏi SO tôi đã liên kết ở trên có cấu hình ví dụ cũng như một số cuộc thảo luận về các vấn đề thời gian biên dịch mà tôi đang nói đến. Nếu bạn cần thêm tài liệu tham khảo để thiết lập plugin, hãy xem trang web của plugin (cũng được liên kết ở trên) cho tài liệu chính thức.

+2

Khi sử dụng Scala với Hibernate, bạn phải nhớ rằng bạn cần sử dụng các lớp sưu tập 'java.util' thay vì các bộ sưu tập Scala. – Madoc

+1

@Madoc cảm ơn, đó là những điều nhỏ nhặt mà tôi đã nhảy để học hỏi từ cảm ơn! – Blankman

+0

@Jesse vì vậy bạn đã làm điều này sau đó? không chắc tôi hiểu vấn đề maven. – Blankman

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