Получить возвращаемое значение в пользовательской аннотации spring aop

Я написал простую пользовательскую аннотацию, чтобы установить HttpHeaders в ResponseEntity из-за дублирования кода везде.

Интерфейс и класс аннотаций.

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface JsonHeader {}


@Component
@Aspect
public class JsonHeaderAspect {
    private final Log logger = LogFactory.getLog(getClass());

    @Around(value = "@annotation(JsonHeader)")
    public Object aroundServiceResponse(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Type", MediaType.APPLICATION_JSON_VALUE);
        return proceedingJoinPoint.proceed(new Object[] {headers});
    }
}

Класс RestController

@RestController
@RequestMapping(path = "/login")
public class LoginRestController {
    private final Log logger = LogFactory.getLog(getClass());

    @Autowired
    LoginServiceImpl loginService;

    @JsonHeader
    @RequestMapping(value = "/user",consumes = MediaType.APPLICATION_JSON_VALUE,produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<ResponseBean> postCheckUser(@RequestBody LoginBean loginBean) {
        ResponseBean responseBean = loginService.checkUser(loginBean);
        return new ResponseEntity<ResponseBean>(responseBean,headers, HttpStatus.OK);
    }
}

Теперь я хочу получить аннотацию возвращаемого значения HttpHeaders для класса контроллера отдыха.

Кто-нибудь может описать, почему это происходит и как решить эту проблему, это будет очень полезно. заранее спасибо


person Shalika    schedule 20.09.2018    source источник


Ответы (1)


Вы можете сделать это, просто изменив свой совет следующим образом. В контроллере ничего делать не нужно.

@Around(value = "@annotation(requestMapping)")
public Object aroundServiceResponse(ProceedingJoinPoint proceedingJoinPoint,RequestMapping requestMapping) throws Throwable {

   String[] consumes = requestMapping.consumes();

        consumes[consumes.length] = MediaType.APPLICATION_JSON_VALUE;

    String[] produces = requestMapping.produces();

        produces[produces.length] = MediaType.APPLICATION_JSON_VALUE;


    return proceedingJoinPoint.proceed();
}
person Sumit Kumar    schedule 20.09.2018
comment
Я использую requestMapping в классах контроллеров. Как его можно использовать только для классов restcontroller? - person Shalika; 20.09.2018