AOP потенциально может помочь вам найти решение, но вам нужно принять меры до того, как будет сгенерировано исключение, потому что исключение приведет к потере слишком большого количества контекста выполнения. Во-первых, когда вы пишете thing.getOtherThing.getText()
, является ли getOtherThing
полем с нечетным именем или вызовом метода, из которого вы случайно пропустили скобки? Если это последнее, вы можете использовать Spring AOP для перехвата метода ( при условии, что thing
на самом деле является компонентом). Если нет, вам понадобится полный AspectJ, так как Spring AOP не осуществляет перехват доступа к полю (из-за того, как он реализован).
Идея состоит в том, что вы используете @Around
, чтобы определить pointcut и получить такой совет:
static final OtherThing THE_DEFAULT_VALUE = ...;
@Around("execution(* getOtherThing())")
public Object supplyDefault(ProceedingJoinPoint pjp) throws Throwable {
Object result = pjp.proceed();
if (result == null)
result = THE_DEFAULT_VALUE;
return result;
}
Или, с AspectJ (не проверено; на самом деле я ни для чего не использовал AspectJ):
aspect ADefaultOtherThing {
static final OtherThing THE_DEFAULT_VALUE = ...;
OtherThing around(): get(OtherThing getOtherThing) {
OtherThing result = proceed();
if (result == null)
result = THE_DEFAULT_VALUE;
return result;
}
}
Тем не менее, я бы задал вопрос, является ли это особенно хорошим использованием АОП. Наверняка было бы лучше поместить такую бизнес-логику прямо в код? Гарантия того, что поле никогда не будет null
, может показаться хорошим инвариантом.