2012-06-29 15 views
6

que estoy recibiendo este error:el uso de plantillas JSON de Juego 2.0

Compilation error [package views.json.Runs does not exist]

cuando claramente existe. No puedo entender lo que podría estar haciendo mal.

la acción en el controlador Runs:

@BodyParser.Of(play.mvc.BodyParser.Json.class) 
public static Result view(Long task_id, Long run_id) { 
    Run run = Run.find.byId(run_id); 
    return ok(views.json.Runs.view.render(run)); 
} 

app/views/Runs/view.scala.json:

@(run: Run) 

{ 
    "started": "@run.started", 
    "completed": "@run.completed" 
} 

He conseguido algunos html plantillas de trabajo, pero esta es la primera plantilla JSON He tratado con 2,0 . No estoy seguro de qué más probar, ya que es lo más básico posible. ¿Alguien tiene alguna idea?

Actualización: He recibido varias sugerencias para las soluciones alternativas, pero todavía estoy interesado en saber cómo funcionan las plantillas, aunque solo sea para comprender mejor los cambios en 2.0.

Respuesta

7

Sólo HTML, XML y TXT aparecen ser soportado por defecto. Para otras extensiones de archivos y formatos, debe registrar "templateTypes" adicionales en $PLAY_HOME/framework/src/sbt-plugin/src/main/scala/PlaySettings.scala (vea también: SBT Settings, cerca de la parte inferior).

Puede ser útil mirar las definiciones de tipos de plantilla estándar que están en $PLAY_HOME/framework/src/play/src/main/scala/play/api/templates/Templates.scala.

También podría hacer trampa y servir su json desde un archivo txt, pero haga response().setContentType("application/json") antes de llamar al método render.

+0

Buen trabajo para encontrar una referencia sólida para respaldar su respuesta. Eso es tan concluyente como podría desear. –

3

Para JSON, ¿por qué no producir directamente una cadena JSON utilizando el Json helper:

public static Result view(Long task_id, Long run_id) { 
    Run run = Run.find.byId(run_id); 
    return ok(play.libs.Json.toJson(run)); 
} 
+0

Estaba tratando de evitar el infinito error de recursión que recibo. En 'Ejecutar' tengo' @ManyToOne (cascade = CascadeType.MERGE) Tarea de tarea pública; 'y en' Tarea' Tengo '@OneToMany (mappedBy =" tarea ", fetch = FetchType.LAZY) public List se ejecuta; '. Es muy posible que esté haciendo algo mal allí, pero aún no he descubierto qué. –

+2

No es una buena práctica tener relaciones bidireccionales. En su lugar, escriba un método "getRuns()" en el bean Task que hace una consulta SQL para recuperar los "Runs". –

+0

Eliminé el campo 'Task.runs', pero la recursión infinita aún ocurre cuando existe el método' getRuns'. Los trabajos encuentran si elimino el método también. Alguna idea sobre eso? –

2

Recomiendo seguir la documentación y dejar que la biblioteca JSON serializar los datos en lugar de escribir el texto JSON por su cuenta : See Serving Json Response.

+0

Bienvenido a Stack Overflow. Dado que los enlaces tienden a cambiar, se recomienda incluir extractos relevantes de la página vinculada junto con el enlace. –

+0

¡Oh, gracias! Esta es su documentación versionada oficial, así que eso es bastante seguro, pero recordaré hacer eso la próxima vez (también conocido como muy perezoso en este momento).:-) –

0

Todavía no entiendo, ¿por qué la gente quiere renderizar su JSON con vistas?

Nota: se trata de la misma manera que @nico_ekito mostró antes y estoy de acuerdo con él totalmente, por debajo de código sólo muestra cómo seleccionar una parte del objeto de JSON

public static Result view(Long task_id, Long run_id){ 

    Run run = Run.find.byId(run_id); 

    ObjectNode result = Json.newObject(); 
    result.put("started", run.started); 
    result.put("completed", run.completed); 

    return ok(Json.toJson(result)); 

} 
+2

Tiene el beneficio de la consistencia cuando html y/o xml también son compatibles, y permite que Play responda en el formato correcto automáticamente. –

+0

Perdió los beneficios al colocar JSON en la plantilla, ya que debe preocuparse por cada coma, dos puntos, corchete, etc. Lo intenté una vez, y nunca más;) especialmente porque quería crear una API realmente grande. bucles en, bucles, en bucles. Por supuesto, con el ObjectNode también es necesario repetir algo, a veces, pero no es necesario buscar en la plantilla el corchete olvidado. – biesior

Cuestiones relacionadas