Spring аспект, как обновить общее поле для нескольких объектов - PullRequest
1 голос
/ 17 января 2020

Я пишу аспект Spring и ищу способ обновить поле возвращаемого объекта

Мои Dto's

@Getter
@Setter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class BaseDto{
   LocalDateTime testTime;
}

@Getter
@Setter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class TestDto{
  private BaseDto baseDtol
}

@Getter
@Setter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class SampleDto{
  private BaseDto baseDtol
}

Мои конвертеры имеют разное значение:

@TestAnnotation
public TestDto covert(){
  return new TestDto()
}

@TestAnnotation
public SampleDto covert(){
  return new SampleDto()
}

Aspect:

@Aspect
@Component
public class TestAspect {
   @AfterReturning(value = "@annotation(TestAnnotation)", returning = "entity")
   public void test(JoinPoint joinPoint, Object entity){
      //Looking for a way to set BaseDto in the TestDto and SampleDto objects
   }
}

Мой аспект будет вызываться из класса конвертеров, а возвращаемыми объектами могут быть SampleDto и TestDto. Я ищу способ установить объект BaseDto в них.

1 Ответ

0 голосов
/ 17 января 2020

Отредактировано

Вы можете использовать java отражение , чтобы динамически установить BaseDto объект в entity поле.

1- Итерация по полям entity.

  • Проверка типа полей (должно быть равно BaseDto.class)

2 - установить доступность отмеченного поля на true.

3 - установить new BaseDto() на поле .

@AfterReturning(pointcut = "servicePointCut()", returning = "entity")
public void afterReturningAdvice(JoinPoint joinPoint, Object entity) throws IllegalAccessException 

{

    //Iterate through fields of entity
    for (Field field : entity.getClass().getDeclaredFields()) {

        //Check type of field (equals to BaseDto.class)
        if (field.getType().equals(BaseDto.class)) {

            //Set accessibility of field to true
            field.setAccessible(true);

            //Set new BaseDto to entityobject
            BaseDto baseDto = new BaseDto();
            field.set(entity, baseDto);
        }

    }

 //Rest of afterReturningAdvice method ...
}
...