У меня есть требование, когда мне нужно вызвать аспект перед обработкой метода конечной точки отдыха, я создал аннотацию и аннотировал конечную точку отдыха,
Я могу обработать запрос, но при чтении InpuStream он уже закрыт внутренний аспект. Фрагмент кода прилагается. Я использую Spring boot 1.5.
Как только я получу входной поток в Аспекте, я кэширую его перед использованием, но моя проблема в текущем коде, он бросает
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;
}
Спасибо, проверю, есть ли документ, в котором сказано, что
Отметьте эту ссылку, если хотите перехватить точки входа stackoverflow.com/questions/35232597/…
Я использовал фильтр и получил входной поток .... большое спасибо




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