Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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 如何将一个函数的验证包装到另一个函数中?_Java_Function_Validation_Design Patterns_Return - Fatal编程技术网

Java 如何将一个函数的验证包装到另一个函数中?

Java 如何将一个函数的验证包装到另一个函数中?,java,function,validation,design-patterns,return,Java,Function,Validation,Design Patterns,Return,比如说,你有一堆函数都需要检查登录验证。首先,它看起来像: public Response createThing(){ if(!validLogin(httpRequest, uriInfo)){ return Response.status(Response.Status.FORBIDDEN); } //Do the function } 第一个代码块存在于每个服务调用的顶部,但我不知道如何将其包装到另一个函数中,因为它包含一个return语句。我想要类似于

比如说,你有一堆函数都需要检查登录验证。首先,它看起来像:

public Response createThing(){
   if(!validLogin(httpRequest, uriInfo)){
      return Response.status(Response.Status.FORBIDDEN);
   }

   //Do the function
}
第一个代码块存在于每个服务调用的顶部,但我不知道如何将其包装到另一个函数中,因为它包含一个return语句。我想要类似于以下内容的内容:

public Response createThing(){
   validateLogin(httpRequest, uriInfo);

   //Do the function
}


我相信人们会使用某种模式或惯例。谢谢。

您可以使用面向方面编程的AOP

public Response validateLogin(){
   if(!validLogin(httpRequest, uriInfo)){
       return Response.status(Response.Status.FORBIDDEN);
   }
   return Responce.status(Response.Status.OK)
}


public Response createThing(){
   if(!validateLogin().equals(Response.status(Response.Status.OK)){
      return Response.status(Response.Status.FORBIDDEN);
   }

   //Do the function
}
使用AspectJ或Spring,您可以定义在代码中的配置点之前、之后或周围应用的“建议”

例如:

@Before("createThing(httpRequest, uriInfo)")
public void validate(HttpRequest request, UriInfo uriInfo) {
     if(!valid(request,uriInfo)) {
          throw new InvalidCreateThingException();
     }
}
这是非常强大和灵活的,特别是如果您使用
@Around
advice,它的指定有点复杂,但意味着您既可以钩住方法的输入,也可以影响其输出。您可以使用通配符配置AOP通知,以便将其应用于任何匹配的对象/方法

Spring的很多“魔力”都是通过AOP实现的。Spring和AspectJ都提供了很好的文档。

从Java8开始,函数被认为是一流的公民。这使您能够以前所未有的方式重用代码。您可以创建包含固定零件和可变零件的模板方法,如下所示:

public <T,U,R extends Response> R doSomething(final BiFunction<T,U,R> funct,T input1,U input2){
  if(validLogin(input1, input2)) {//fixed part
     return funct.apply(input1,input2);//variable part
  }
}
public R doSomething(最终双功能函数,T输入1,U输入2){
if(validLogin(input1,input2)){//固定部分
return funct.apply(input1,input2);//变量部分
}
}

这是JavaEE吗?您将为此使用过滤器。我相信一般模式被称为“拦截过滤器”,将其作为验证方法抛出并在包装器方法中处理的异常处理可以吗?例如,有一个自定义异常?对于这个特定的情况,是的,它是JavaEE,但是对于类似的底层调用,我也有同样的问题(比如验证输入不为null)。不过,我会看看拦截过滤器,谢谢。@Rhayene抛出一个异常并在包装器方法中处理它仍然会让我回到包装器方法中返回语句的原始问题,唯一的区别是try/catch块与if语句。如果输入有效,您会返回什么?正如我现在读到的,只有当某个内容无效时,才会返回该内容,所以我根本不会返回该内容,而是将该信息包含在一个异常中。但我可能错了:)这仍然让我在结构上回到了同一个问题,还有其他问题。createThing()的前三行仍然会重复;我得调查一下,谢谢。
public <T,U,R extends Response> R doSomething(final BiFunction<T,U,R> funct,T input1,U input2){
  if(validLogin(input1, input2)) {//fixed part
     return funct.apply(input1,input2);//variable part
  }
}