2017-02-21 47 views
2

举例来说,你有一堆功能都需要检查登录验证。首先,它看起来是这样的:如何在另一个函数中封装函数的验证?

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 
} 

public Response createThing(){ 
    //Implied check somehow? 

    //Do the function 
} 

我敢肯定有一些图案或约定,在那里,人们使用。谢谢。

+0

这是JavaEE吗?你会用这个过滤器。我相信一般模式被称为“拦截过滤器” – puhlen

+0

它可以把它作为你的验证方法引发的异常处理,并在你的包装方法中处理?例如,自定义异常? – Rhayene

+0

对于这个特定的情况,是的,它是JavaEE,但是我也有类似的底层调用的相同问题(例如验证输入不为空)。我会看看拦截过滤器,谢谢。 – GuitarStrum

回答

2

Java 8开始,功能被认为是一等公民。这使您可以以前所未有的方式重用代码。您可以创建一个包含固定部分和可变部分的模板方法,如下所示:

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 
    } 
} 
+0

这看起来很有前途;我得看看这个,谢谢。 – GuitarStrum

-2
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 
} 
+0

除此之外,这仍然将我带回到结构相同的问题。 createThing()的前三行仍然是重复的。 – GuitarStrum

0

你可以使用AOP,面向方面编程。

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

例如:

@Before("createThing(httpRequest, uriInfo)") 
public void validate(HttpRequest request, UriInfo uriInfo) { 
    if(!valid(request,uriInfo)) { 
      throw new InvalidCreateThingException(); 
    } 
} 

这是非常强大和灵活,特别是如果你使用@Around的建议,这是较为复杂的指定,而是意味着你既可以钩到方法的输入,以及影响其产出。您可以使用通配符配置AOP建议,以便将其应用于任何匹配的对象/方法。

很多Spring的“魔术”是使用AOP实现的。 Spring和AspectJ都提供了很好的文档。

相关问题