JavaActionsComposition - opensas/Play20Es GitHub Wiki

Composición de Acciones

Esta página todavía no ha sido traducida al castellano. Puedes ayudarnos con la tarea simplemente presionando el botón Edit Page. Para más información puedes leer esta guía para el traductor. Aquí puedes ver cuánto nos falta para terminar la traducción.

Este capítulo introduces varias maneras de definir funcionalidades genéricas de Acciones.

Recordatorio sobre acciones

Anteriormente hemos dicho que una acción es un método Java que retorna un valor play.mvc.Result. Realmente, Play maneja internamente las acciones como funciones. Debido a que Java no soporta funciones como objetos de primera clase, una acción proveída por el API Java es realmente una instancia de play.mvc.Action:

public abstract class Action {
    
  public abstract Result call(Http.Context ctx);    
    
}

Play construye una acción principal para usted que básicamente llama un método de acción apropiado. Esto permite una composición de acciones mas complicada.

Composición de acciones

Usted puede componer el código proveído por el método de acción con otro play.mvc.Action, usando la anotación @With:

@With(VerboseAction.class)
public static Result index() {
  return ok("It works!");
}

Aquí está la definición de VerboseAction:

public class VerboseAction extends Action.Simple {

  public Result call(Http.Context ctx) throws Throwable {
    Logger.info("Calling action for " + ctx);
    return delegate.call(ctx);
  }
}

En algún punto necesitará delegar al método de acción dentro del wrapper usando delegate.call(...).

También puede mezclar diferentes acciones:

@With(Authenticated.class, Cached.class)
public static Result index() {
  return ok("It works!");
}

Nota: Las anotaciones play.mvc.Security.Authenticated y play.cache.Cached y las correspondientes acciones predefinidas vienen con Play. Consulte la documentación de API apropiada para mayor información.

Definiendo anotaciones Custom para acciones

Usted también puede marcar la composición de acciones con sus propias anotaciones, las cuales también deben estar anotadas con @With:

@With(VerboseAction.class)
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Verbose {
   boolean value() default true;
}

Con eso, usted puede utilizar su nueva anotación con un método de acción:

@Verbose(false)
public static Result index() {
  return ok("It works!");
}

Su definición de acción obtiene la anotación como configuración:

public class VerboseAction extends Action<Verbose> {

  public Result call(Http.Context ctx) {
    if(configuration.value) {
      Logger.info("Calling action for " + ctx);  
    }
    return delegate.call(ctx);
  }
}

Anotando controladores

Usted también puede colocar cualquier anotación de composición de acciones directamente en la clase Controlador. En este caso será aplicada a todos los métodos de acción definidos por el controlador.

@Authenticated
public Admin extends Controller {
    
  …
    
}

Next: Programación HTTP Asíncrona

⚠️ **GitHub.com Fallback** ⚠️