Входной поток закрывается до достижения ASPECT весной

У меня есть требование, когда мне нужно вызвать аспект перед обработкой метода конечной точки отдыха, я создал аннотацию и аннотировал конечную точку отдыха,

Я могу обработать запрос, но при чтении InpuStream он уже закрыт внутренний аспект. Фрагмент кода прилагается. Я использую Spring boot 1.5.

GitHub https://github.com/primeap/user-auth-poc.git

Как только я получу входной поток в Аспекте, я кэширую его перед использованием, но моя проблема в текущем коде, он бросает

io exception stream is closed

на линии

Map jsonMap = mapper.readValue(request.getInputStream(), Map.class);

заявка

@SpringBootApplication
@ComponentScan(basePackages = { "org.ap" })
public class UserAuthPocApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserAuthPocApplication.class, args);
    }
}

Аннотации

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

}

Аспект

@Aspect
@Component
public class MyPrivilegeAspect {
    @Before("@annotation(HasPrivilegeXX)")
    public boolean logBeforeAllMethods(JoinPoint joinPoint) {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
                .getRequest();
        try {
            ObjectMapper mapper = new ObjectMapper();
            Map<String, Object> jsonMap = mapper.readValue(request.getInputStream(), Map.class);
            System.out.println("In aspect " + jsonMap.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }
}

Конечная точка отдыха

@RestController
@RequestMapping("/api")
public class Api {
    @PostMapping("/hi")
    @HasPrivilegeXX()
    public String hiPost(@RequestBody User user) {
        System.out.println(user.toString());
        return "Hi...";
    }
}

Пользователь

public class User {
    private String name;
    private String company;
    private Integer id;
}

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

M. Deinum 31.10.2018 07:37

Спасибо, проверю, есть ли документ, в котором сказано, что

Arvind 31.10.2018 09:01

Отметьте эту ссылку, если хотите перехватить точки входа stackoverflow.com/questions/35232597/…

Deepak Gunasekaran 31.10.2018 09:18

Я использовал фильтр и получил входной поток .... большое спасибо

Arvind 31.10.2018 11:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
283
0

Другие вопросы по теме