Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为游戏编写自定义过滤器!Java中的2.2_Java_Playframework - Fatal编程技术网

为游戏编写自定义过滤器!Java中的2.2

为游戏编写自定义过滤器!Java中的2.2,java,playframework,Java,Playframework,我有一个简单的场景:自动为每个HTTP响应添加一个响应头;我想用Java做这个 查看src/play filters helpers/src/main/java/play/filters/*,有一些示例可以作为注释应用。我希望避免向每个处理程序添加@AddMyHeader 具体地看一下src/play-filters-helpers/src/main/scala/play/filters/*和gzip-filter,我看到了一个清晰的机制,但我对scala还不够熟悉,无法将其推广到Java 那么

我有一个简单的场景:自动为每个HTTP响应添加一个响应头;我想用Java做这个

查看
src/play filters helpers/src/main/java/play/filters/*
,有一些示例可以作为注释应用。我希望避免向每个处理程序添加
@AddMyHeader

具体地看一下
src/play-filters-helpers/src/main/scala/play/filters/*
gzip-filter
,我看到了一个清晰的机制,但我对scala还不够熟悉,无法将其推广到Java


那么:我该怎么办呢?

不幸的是,目前还没有一种从Java创建和使用过滤器的好方法。但使用Scala,您可以非常轻松地完成所需的工作

创建包含以下内容的新文件
app/filters/AddResponseHeader.scala

package filters

import play.api.mvc._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

object AddResponseHeader extends Filter {
  def apply(f: (RequestHeader) => Future[SimpleResult])(rh: RequestHeader): Future[SimpleResult] = {
    val result = f(rh)
    result.map(_.withHeaders("FOO" -> "bar"))
  }
}
import filters.AddResponseHeader
import play.api.mvc.WithFilters

object Global extends WithFilters(AddResponseHeader)
并创建一个新文件
app/Global.scala
,其中包含:

package filters

import play.api.mvc._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

object AddResponseHeader extends Filter {
  def apply(f: (RequestHeader) => Future[SimpleResult])(rh: RequestHeader): Future[SimpleResult] = {
    val result = f(rh)
    result.map(_.withHeaders("FOO" -> "bar"))
  }
}
import filters.AddResponseHeader
import play.api.mvc.WithFilters

object Global extends WithFilters(AddResponseHeader)
这将为每个响应应用一个新的响应头

更新:有一种方法可以在
Global.java
文件中使用:

@Override
public <T extends EssentialFilter> Class<T>[] filters() {
    return new Class[] {AddResponseHeader.class};
}
@覆盖
公共类[]过滤器(){
返回新类[]{AddResponseHeader.Class};
}
还可以将上面的
对象AddResponseHeader
更改为
类AddResponseHeader
,以添加自定义筛选器(MyFilter.class),并在根包中创建一个Global.java文件。在PlayFramework 2.3.x和Java(JDK8)中测试

导入play.GlobalSettings;
导入play.api.mvc.EssentialFilter;
公共类全局扩展全局设置{
@凌驾
公共类[]过滤器(){
返回新类[]{MyFilter.Class};
}
}

没有一个好的Java API可用于创建播放过滤器。但是,您可以将现有的Scala API改编成一个漂亮的Java模板

例如:

import play.api.mvc.*;
import scala.Function1;
import scala.concurrent.Future;
import scala.runtime.AbstractFunction1;

public abstract class JavaFilter implements Filter {

@Override
public Future<Result> apply(Function1<RequestHeader, Future<Result>> nextFilter, RequestHeader requestHeader) {
    return nextFilter
            .apply(requestHeader)
            .map(new AbstractFunction1<Result, Result>() {
                     @Override
                     public Result apply(Result currentResult) {
                         return Apply(currentResult, requestHeader);
                     }
                 },
                    play.api.libs.concurrent.Execution.defaultContext());
}

@Override
public EssentialAction apply(EssentialAction next) {
    return Filter$class.apply(this, next);
}

public abstract Result Apply(Result currentResult, RequestHeader requestHeader);
}

要进一步了解它是如何工作的,请参阅我的博客文章

尽管我不得不删除我的Global.java,它最终看起来像:
object Global extends with filters(AddResponseHeader,new GzipFilter())
是否有可能将其添加到
Global.java
?答案中给出了一种方法。