2012-01-18 8 views
7

Esto podría parecer una pregunta extraña, pero estoy tratando de entender qué es la "mejor práctica" para convertir una aplicación que está configurado para usar algo como la generación de controladores de Roo o Grails (que proporciona la funcionalidad CRUD básica) a algo que devuelve un cuerpo de respuesta JSON para su uso en una aplicación de JavaScript.Cómo cambiar un proyecto de Spring Roo o Grails de MVC típico a AJAX/JSON/REST

La ambigüedad de la tecnología aquí se debe a que aún no he comenzado el proyecto. Todavía estoy tratando de decidir qué tecnología (basada en Java) usar y ver qué tipo de herramientas de productividad debo aprender/usar en el proceso. Será una aplicación web y usará una capa de persistencia de base de datos. Todos los demás detalles están en el aire.

Quizás la forma más fácil de lograr mi objetivo es desarrollar usando algún tipo de complemento AJAX para empezar, pero la mayoría de los tutoriales y descripciones que existen dicen comenzar con una arquitectura MVC normal. Roo parece dificultar la conversión de los controladores que genera a los tipos de retorno compatibles con JSON, y no estoy lo suficientemente familiarizado con Groovy/Grails para saber qué se necesita para hacer eso.

Esto es principalmente una experiencia de aprendizaje para mí, y estoy abierto a cualquier crítica o consejo, pero al ser un foro de preguntas y respuestas, me doy cuenta de que necesito incorporar una pregunta objetiva de algún tipo. Para llenar esa necesidad, pregunto:

¿Cuál es la mejor manera de configurar una interfaz AJAX/RESTful para mis entidades en Roo y/o Grails?

Respuesta

8

Hace poco hice exactamente esto con una aplicación Grails y me pareció sorprendentemente fácil tomar los controladores generados y obtener salida JSON o XML o el HTML de la vista dependiendo de la negociación del contenido.

Los lugares en el manual de Grails a considerar son las secciones de Negociación de contenido y, si necesita tratar con la entrada JSON o XML, la clasificación.


Para obtener JSON y XML de salida, en el método por defecto list(), lo cambió a este (tengo un objeto Session, en este caso ... una de mis clases de dominio):

def list() { 
    params.max = Math.min(params.max ? params.int('max') : 10, 100) 
    def response = [sessionInstanceList: Session.list(params), sessionInstanceTotal: Session.count()] 
    withFormat { 
     html response 
     json {render response as JSON} 
     xml {render response as XML} 
    } 
} 

En cualquier lugar al que devuelva solo un objeto por defecto, querrá reemplazar el valor devuelto con el bloque withFormat.

También es posible que deba actualizar su archivo Config.groovy donde trata con tipos de mime. Aquí es lo que tengo:

grails.mime.file.extensions = true // enables the parsing of file extensions from URLs into the request format 
grails.mime.use.accept.header = true 
grails.mime.types = [ html: ['text/html','application/xhtml+xml'], 
         xml: ['text/xml', 'application/xml'], 
         text: 'text/plain', 
         js: 'text/javascript', 
         rss: 'application/rss+xml', 
         atom: 'application/atom+xml', 
         css: 'text/css', 
         csv: 'text/csv', 
         all: '*/*', 
         json: ['application/json','text/json'], 
         form: 'application/x-www-form-urlencoded', 
         multipartForm: 'multipart/form-data' 
        ] 

Como entrada (a una acción update() o save(), por ejemplo) JSON y XML cargas útiles serán automáticamente unmarshaled y sólo estarán obligadas al igual que un formulario de entrada sería, pero yo He descubierto que el proceso de eliminación de personal es un poco exigente (especialmente con JSON).

Encontré que, para que JSON se manejara correctamente en el método update(), el atributo class tenía que estar presente y ser correcto en el objeto JSON entrante. Dado que la biblioteca que estaba utilizando en mi aplicación cliente no hacía que tratar este tema fuera fácil, cambié a usar XML en su lugar.

+0

¡Gracias por una respuesta tan elaborada! Este es exactamente el tipo de cosa que estaba buscando. – Andy

Cuestiones relacionadas