2012-06-26 13 views
17

Quiero crear un multi-módulo (experto) aplicación MVC primavera, con módulos como:¿Cómo usar efectivamente Scala en un proyecto Spring MVC?

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

Ahora para usar Scala de este proyecto, puedo escribir Scala todas partes sin ningún problema? ¿O debería usar scala para mi módulo de servicios y java para el módulo web?

Sé que hibernate tendrá que estar en java.

¿Pensamientos? ¿Consejo?

¿Hay algún problema que tener en cuenta? ¿Es esta una buena idea? ¿Tendré que hackear ciertas partes para unirlas?

+0

Mi consejo: "do not". ;) –

Respuesta

16

Sí, puede usar Scala para su código Spring MVC y sus clases de Hibernate.

Aquí es un ejemplo de un controlador MVC primavera en Scala tomado de uno de mis proyectos:

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

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

    "home/home" 
    } 
} 

Y un ejemplo de una clase de dominio de Hibernate. Tenga en cuenta el uso de clases privadas de recolección de Java para Hibernate adaptadas por las clases públicas de la colección Scala para los usuarios de la clase (ayudado por la clase JavaConversions de 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 
    } 
} 

La única cosa que he encontrado que he tenido utilizar Java para escribir se @Retention(RUNTIME) anotaciones (por JSR-303 validaciones).

Uso Maven y el plugin maven-scala con proyectos mixtos de Java/Scala.

+0

¿Hay algún manual sobre cómo usar Scala y Spring? Sí, podemos usar Spring con scala, pero ¿qué pasa con los matices? – Cherry

+0

¿Qué ...? Por favor, no escriba el código Scala de esta manera. Nunca. :( –

+1

¿Podría ser más específico? ¿Cómo escribiría el código Hibernate en Scala? – sourcedelica

3

Puedes usar scala & java juntos para lo que creas que funciona mejor.

Sé que hibernate tendrá que estar en java.

Esto no es necesariamente cierto. Puede usar clases scala como objetos Hibernate ORM. Solo debe asegurarse de que los archivos .class compilados terminen con los mismos getters, setters y constructores predeterminados que Hibernate espera.

Incluso su módulo de aplicación web se puede escribir en scala. Los controladores solo deben cumplir el contrato que Spring MVC espera.

En general, casi todo lo escrito en Java se puede volver a escribir en scala. De tosco hay excepciones pero no te limitas por madurez a intentarlo. Suponiendo que su código actual no hace nada alucinado (es decir, reflexión de magia negra), debería estar bien.

La pregunta interesante aquí es cómo conseguir que funcione con Maven ...

Hay un existing SO question que describe el uso de la maven-scala-plugin para obtener este tipo de proyectos de trabajo (multi-módulo con recursos Scala y java mixtos) . El único comentario adicional que agregaré a esta solución es que, según mi experiencia, solo podríamos hacerlo funcionar con módulos scala que dependan de fuentes Java, y no al revés. Esto fue porque nuestra configuración maven utilizó el compilador de java y el compilador de scala por separado. En teoría, el compilador scala también puede compilar archivos Java, por lo que si lo configuraste para usar solo un compilador para todo, no encontrarás esta limitación.

EDIT:

Blankman comentado:
@Jesse por lo que han hecho esto también entonces? no estoy seguro de entender el problema Maven.

Sí, he trabajado en un par de proyectos que han utilizado fuentes mixtas de java y scala. No usamos Scala para la capa de Hibernate, pero lo hicimos para todo lo demás.

El problema de maven que estoy describiendo fue una consecuencia de nuestra configuración de maven-scala-plugin. Debe configurarlo para saber cómo compilar sus archivos scala. Nuestra configuración (probablemente no es correcta) se configuró para compilar archivos java primero, usando javac, y luego compilar archivos scala, usando scalac.Esto significaba que no se nos permitía escribir código java que hiciera referencia a las clases scala porque no estarían disponibles en tiempo de compilación. Con la configuración adecuada, debería ser posible utilizar el compilador scalac para compilar todas las fuentes juntas, lo que eliminará esta restricción incómoda. La pregunta SO a la que me he vinculado anteriormente tiene una configuración de ejemplo, así como algunas discusiones sobre los problemas del tiempo de compilación de los que estoy hablando. Si necesita más referencias para configurar el complemento, consulte el sitio web del complemento (también vinculado al anterior) para el documento oficial.

+2

Al utilizar Scala con Hibernate, debe tener en cuenta que debe utilizar las clases de colección 'java.util' en lugar de las colecciones Scala. – Madoc

+1

@Madoc gracias, son pequeñas cosas como que estaba esperando aprender de gracias! – Blankman

+0

@Jesse, ¿has hecho esto también entonces? no estoy seguro de entender el problema Maven. – Blankman

Cuestiones relacionadas