2013-07-27 4 views
1

Я использую совет AOP для преобразования объекта User в объект Owner. Преобразование выполняется в совете, но я хотел бы передать этому объекту Owner объекту.Установите переменную из совета АОП

@Aspect 
public class UserAuthAspect { 
    @Inject 
    private OwnerDao ownerDao; 

    @Pointcut("@annotation(com.google.api.server.spi.config.ApiMethod)") 
    public void annotatedWithApiMethod() { 
    } 

    @Pointcut("execution(* *.*(.., com.google.appengine.api.users.User)) && args(.., user)") 
    public void allMethodsWithUserParameter(User user) { 
    } 

    @Before("annotatedWithApiMethod() && allMethodsWithUserParameter(user)") 
    public void checkUserLoggedIn(com.google.appengine.api.users.User user) 
      throws UnauthorizedException { 
     if (user == null) { 
      throw new UnauthorizedException("Must log in"); 
     } 
     Owner owner = ownerDao.readByUser(user); 
    } 
} 

Класс с консультировали методами:

public class RealEstatePropertyV1 { 
    @ApiMethod(name = "create", path = "properties", httpMethod = HttpMethod.POST) 
    public void create(RealEstateProperty property, User user) throws Exception { 
     Owner owner = the value set by the advice 
    } 
} 

ответ

0

Я не знаю, если это правильный способ сделать это, так что не стесняйтесь комментировать. Я создал интерфейс Authed и его реализацию AuthedImpl.

public interface Authed { 
    void setOwner(Owner owner); 
} 

Тогда я сделал RealEstatePropertyV1 простирается от AuthedImpl. Я добавил pointcut для всех классов, простирающихся от AuthedImpl, а также изменил pointcut, чтобы я мог получить доступ к цели.

@Pointcut("execution(* *..AuthedImpl+.*(..))") 
public void extendsAuthedImpl() { 
} 

@Pointcut("execution(* *.*(.., com.google.appengine.api.users.User)) && args(.., user) && target(callee)") 
public void allMethodsWithUserParameter(User user, Authed callee) { 
} 

Наконец совет использует все: срезы в

@Before("annotatedWithApiMethod() && allMethodsWithUserParameter(user, callee) && extendsAuthedImpl()") 
public void checkUserLoggedIn(com.google.appengine.api.users.User user, 
     Authed callee) throws UnauthorizedException { 
    System.out.println(callee.getClass()); 
    if (user == null) { 
     throw new UnauthorizedException("Must log in"); 
    } 
    Owner owner = ownerDao.readByUser(user); 
    callee.setOwner(owner); 
} 
+0

Может быть, я пропустил что-то, но если 'RealEstatePropertyV1' (часть вашей обычной программы) распространяется' AuthedImpl' (часть вашего аспекта), Безразлично 't он создает зависимость между программой и аспектом? Вам нужен «Владелец» только в методах аспект или в обычной программе? Возможно, это просто имя меня смущает: это аспект UserAuthAspect * или * вставлять владельца? – Beryllium

+0

Вы правы, я представил зависимость между моей программой и аспектом. Мне нужна «Владелец» в обычной программе. В основном я хочу, чтобы мой аспект преобразовал «Пользователь» в «Владелец», а затем передал «Владелец» обратно в обычную программу. – Sydney

+0

Фактически 'AuthImpl' не является частью аспекта. Аспект - это просто «UserAuthAspect». – Sydney

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