1

オブジェクトをオブジェクトAOPに変換するためにアドバイスを使用します。変換はアドバイスで行われますが、そのオブジェクトを呼び出し元に渡したいと思います。UserOwnerOwner

@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
  }
}
4

1 に答える 1

0

それが正しい方法かどうかはわかりませんので、お気軽にコメントしてください。インターフェイスAuthedとその実装を作成しましたAuthedImpl

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

それから私はRealEstatePropertyV1から拡張しましAuthedImplた。から拡張するすべてのクラスのポイントカットを追加し、ポイントカットをAuthedImpl変更して、ターゲットにアクセスできるようにしました。

@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);
}
于 2013-07-28T12:05:50.523 に答える