2012-06-26 4 views
17
내가 좋아하는 모듈로, 멀티 모듈 (받는다는) 스프링 MVC 응용 프로그램을 만들려면

: 이제 Spring MVC 프로젝트에서 Scala를 효과적으로 사용하는 방법은 무엇입니까?

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

내가 아무 문제없이 모든 곳에서 스칼라를 쓸 수 있습니다,이 프로젝트에 스칼라를 사용하는? 서비스 모듈에는 scala를, 웹 모듈에는 java를 사용해야합니까?

나는 최대 절전 모드가 Java에 있어야한다는 것을 알고있다.

생각하십니까? 조언?

주목해야 할 문제가 있습니까? 이것은 좋은 생각입니까? 나는 그들을 접착하기 위해 특정 부품을 해킹해야합니까?

+0

내 조언 : "하지마." ;) –

답변

16

예, Spring MVC 코드와 Hibernate 클래스 모두에 대해 Scala를 사용할 수 있습니다.

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

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

    "home/home" 
    } 
} 

그리고 최대 절전 모드 도메인 클래스의 예 : 여기

내 프로젝트 중 하나에서 가져온 스칼라에서 스프링 MVC 컨트롤러의 예입니다. Hibernate를위한 퍼블릭 스칼라 콜렉션 클래스가 스칼라의 JavaConversions 클래스를 사용하여 도움을 주도록 Hibernate를위한 프라이빗 자바 콜렉션 클래스의 사용에 주목하자.

@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 
    } 
} 

유일한 것은 내가 이 (JSR-303 검증을 위해) @Retention(RUNTIME) 주석을 쓰는 자바를 사용하는 했어 것으로 나타났습니다.

저는 Java/Scala 프로젝트가 혼합 된 Maven과 Maven-scala-plugin을 사용합니다.

+0

스칼라와 스프링의 사용법에 대한 매뉴얼이 있습니까? 스프링을 scala와 함께 사용할 수 있습니다. 그러나 뉘앙스는 어떻습니까? – Cherry

+0

뭐 ...이 스칼라 코드를 쓰지 마라. 이제까지. : –

+1

더 구체적으로 할 수 있을까요? Scala에서 Hibernate 코드를 작성하는 방법은 무엇입니까? – sourcedelica

3

가장 적합한 것으로 생각되는 항목에 scala & java를 함께 사용할 수 있습니다.

나는 최대 절전 모드가 Java에 있어야한다는 것을 알고 있습니다.

이것은 반드시 사실 일 필요는 없습니다. 스칼라 클래스를 Hibernate ORM 객체로 사용할 수 있습니다. 컴파일 된 .class 파일이 Hibernate가 기대하는 것과 동일한 getter, setter 및 기본 생성자로 끝나기 만하면됩니다.

웹 응용 프로그램 모듈도 스칼라로 작성할 수 있습니다. 컨트롤러는 Spring MVC가 기대하는 계약을 준수하기 만하면된다.

일반적으로 Java로 작성된 거의 모든 항목은 스칼라로 다시 작성할 수 있습니다. 거친 것 중에는 예외가 있지만 시도마다 자신을 제한하는 것은 아닙니다. 기존 코드가 미친 짓 (예 : 검은 마법 반사)을하지 않는다고 가정하면 정상이어야합니다. 여기

흥미로운 질문은

이 (혼합 스칼라와 자바 자원으로 멀티 모듈) 프로젝트 작업의 종류를 얻을 수있는 maven-scala-plugin을 사용하여 설명하는 existing SO question 있습니다 ... 메이븐 작업을 얻는 방법이다 . 이 솔루션에 추가 할 유일한 추가 설명은 내 경험에 비추어 볼 때 자바 소스에 종속적 인 스칼라 모듈로 작업 할 수 있다는 것입니다. 이것은 우리의 maven config가 자바 컴파일러와 scala 컴파일러를 seprarately 사용했기 때문입니다. 이론적으로 스칼라 컴파일러는 Java 파일도 컴파일 할 수 있으므로 모든 컴파일러에서 하나의 컴파일러 만 사용하도록 구성하면이 제한이 발생하지 않습니다.

편집 :

Blankman 주석 :
@Jesse 당신은 또한 다음 이런 짓을했는지, 그래서? 내가 웬일이 문제를 이해하는지 모르겠다.

예, 저는 혼합 된 자바 및 스칼라 소스를 사용하는 몇 가지 프로젝트에 참여했습니다. 우리는 Hibernate 레이어를 위해 스칼라를 사용하지 않았지만 우리는 다른 모든 것들을 위해서했다.

내가 설명하는 문제는 우리의 maven-scala-plugin 구성의 결과입니다. 스칼라 파일을 컴파일하는 방법을 알도록 구성해야합니다. 구성 (아마도 올바르지 않음)은 자바 파일을 먼저 컴파일하고 scalac을 사용하여 스칼라 파일을 컴파일하도록 설정되었습니다.이것은 컴파일 시간에 사용 가능하지 않기 때문에 scala 클래스를 참조한 java 코드를 작성할 수 없다는 것을 의미합니다. 적절한 구성을 사용하면 scalac 컴파일러를 사용하여 모든 소스를 컴파일하여 이러한 어색한 제한을 제거 할 수 있어야합니다. 위에 링크 된 SO 질문에는 예제 구성뿐 아니라 내가 말하는 컴파일 시간 문제에 대한 토론이 있습니다. 플러그인 설정에 대한 추가 참조가 필요하면 공식 문서에 대한 플러그인 웹 사이트 (위에 링크되어 있음)를 확인하십시오.

+2

Hibernate에서 Scala를 사용할 때, Scala 콜렉션 대신에 java.util 콜렉션 클래스를 사용해야한다는 것을 명심해야한다. – Madoc

+1

@Madoc 덕분에, 나는 감사에서 배울 호핑이었던 것과 같은 작은 것들입니다! – Blankman

+0

@Jesse 그럼 당신도 이것을 했나요? 내가 웬일이 문제를 이해하는지 모르겠다. – Blankman

관련 문제