Я знаю, что это старый вопрос, но официально до сих пор не решен. Я только что видел это, поэтому я собираюсь ответить на него:
Вы упомянули, что URI являются неизменяемыми. Так что в основном это подсказка к правильному решению: перехватить создание объекта (вызов конструктора) и проверить результат в around()
рекомендации. Если все в порядке, передайте неизмененный URI, в противном случае создайте новый, исправляя или канонизируя все, что не так.
Предположим, у вас есть класс приложения, создающий URI:
package de.scrum_master.aspectj.sample.uri;
import java.net.URI;
import java.net.URISyntaxException;
public class URIApp {
public static void main(String[] args) throws URISyntaxException {
URI[] uris = {
new URI("https://google.com?search=olympics"),
new URI("http://yahoo.com/mail/login"),
new URI("https://facebook.com/user?name=kriegaex"),
new URI("http://stackoverflow.com/questions/123456")
};
for (URI uri : uris)
System.out.println(uri);
}
}
Далее предположим, что мы считаем все URI со схемой / протоколом «http» небезопасными и, следовательно, ошибочными. Мы хотим исправить это, заменив URI другим, используя «https». Мы сделаем это в аспекте:
package de.scrum_master.aspectj.sample.uri;
import java.net.URI;
import java.net.URISyntaxException;
public aspect URIFixer {
pointcut uriCreation() : call(URI.new(..)) && !within(URIFixer);
URI around() throws URISyntaxException : uriCreation() {
URI result = proceed();
return isOk(result) ? result : fix(result);
}
boolean isOk(URI uri) {
return "https".equals(uri.getScheme());
}
URI fix(URI uri) throws URISyntaxException {
return new URI("https", uri.getAuthority(), uri.getPath(), uri.getQuery(), uri.getFragment());
}
}
Надеюсь, это ответит на ваш вопрос, хотя и с запозданием. Я подумал, что должен документировать решение здесь для дальнейшего использования другими пользователями, которые могут его найти.