2015-04-06 2 views
0

Я использую play framework 2.0, он имеет очень легкий поток ... маршруты -> контроллеры -> сервис -> модель -> контроллеры -> результат.Как получить переменную пути в intercepter

Ну, после этого у меня есть контроллер, который получает переменную пути от маршрутов.

GET/пользователь /: идентификатор пользователя controller.user.getUser (идентификатор пользователя: String)

Как вы можете видеть, что это на самом деле идентификатор пользователя, я хочу, чтобы проверить этот USERID (проверьте, существует ли это в нашей базе или нет), но не в контроллере, а с помощью аннотацию, что-то вроде этого ..

//My annotation for validating userId 
@ValidateUserId(userId) 
public static Result getUser(userId) 

ответ

0

Основная проблема с этим понятием является тот факт, что PARAMS аннотацию должен быть постоянной, @see topic about this так что вы будете не можете использовать userId, как показано в коде. Вместо этого вы можете создать аннотацию, которая читает сам контекст, а затем проанализировать URI, чтобы получить идентификатор пользователя. то есть:

приложение/myannotations/MyAnnotations.class

package myannotations; 

import play.mvc.With; 

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 


public class MyAnnotations { 

    @With(ValidateUserIdAction.class) 
    @Target({ElementType.TYPE, ElementType.METHOD}) 
    @Retention(RetentionPolicy.RUNTIME) 
    public @interface ValidateUserId { 
     String patternToReplace(); 
     String redirectTo(); 
    } 

} 

приложение/myannotations/ValidateUserIdAction.class

package myannotations; 

import play.mvc.Action; 
import play.mvc.Http; 
import play.mvc.Result; 

import static play.libs.F.Promise; 

public class ValidateUserIdAction extends Action<MyAnnotations.ValidateUserId> { 

    public Promise<Result> call(Http.Context ctx) throws Throwable { 
     boolean isValid = false; 

     // This gets the GET path from request 
     String path = ctx.request().path(); 
     try { 
      // Here we try to 'extract' id value by simple String replacement (basing on the annotation's param) 
      Long userId = Long.valueOf(path.replace(configuration.patternToReplace(), "")); 

      // Here you can put your additional checks - i.e. to verify if user can be found in DB 
      if (userId > 0) isValid = true; 

     } catch (Exception e) { 
      // Handle the exceptions as you want i.e. log it to the logfile 
     } 

     // Here, if ID isValid we continue the request, or redirect to other URL otherwise (also based on annotation's param) 
     return isValid 
       ? delegate.call(ctx) 
       : Promise.<Result>pure(redirect(configuration.redirectTo())); 
    }  
} 

так что вы можете использовать его с действием, как:

@MyAnnotations.ValidateUserId(
    patternToReplace = "/user/", 
    redirectTo = "/redirect/to/url/if/invalid" 
) 
public static Result getUser(userId){ 
    .... 
} 

Конечно, это очень простой пример, и вам может понадобиться/нужно сделать условие в вашем классе validationAction более сложным или добавить дополнительные параметры, чтобы сделать его еще более общим, все зависит от вас.

+1

Hi @biesior Спасибо, да, он работает. но я хотел, чтобы я мог прочитать параметр, который будет передан в методах, так что мне не нужно разбирать строку пути. Но все равно спасибо. :) –

Смежные вопросы