Java中如何在RequestBodyAdviceAdapter中判断类型是否实现指定接口
问题根因
你之前所有写法不符合预期的核心原因是混淆了Java反射API中isInstance和isAssignableFrom的用法:
Class.isInstance(Object obj):用于判断传入的对象实例是否是该Class的实例,你直接传入Iloggable.class(这是Class对象,不是业务类实例)必然返回不符合预期的结果Class.isAssignableFrom(Class<?> cls):用于判断传入的Class类型是否是当前Class的子类/实现类,恰好符合你判断接口实现的需求
另外RequestBodyAdviceAdapter#supports方法的第二个Type参数,就是Controller方法接收的请求参数的类型,普通无泛型的场景下该Type的实际类型就是Class。
正确实现
场景1:请求参数为普通无泛型类型(最常用)
直接判断参数类型是否实现了Iloggable即可:
@ControllerAdvice public class CustomRequestBodyAdviceAdapter extends RequestBodyAdviceAdapter { @Override public boolean supports(MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) { // 方式一:通过Type参数判断 if (type instanceof Class) { return Iloggable.class.isAssignableFrom((Class<?>) type); } // 方式二:通过MethodParameter直接拿参数类型,普通场景等效 // return Iloggable.class.isAssignableFrom(methodParameter.getParameterType()); return false; } // 其他重写方法 }
场景2:请求参数为带泛型的容器类型(如List<CreateAccountRequest>)
需要先取出泛型的实际类型再判断:
@Override public boolean supports(MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) { if (type instanceof Class) { return Iloggable.class.isAssignableFrom((Class<?>) type); } if (type instanceof ParameterizedType parameterizedType) { // 取泛型的实际类型 Type[] actualTypeArgs = parameterizedType.getActualTypeArguments(); if (actualTypeArgs.length > 0 && actualTypeArgs[0] instanceof Class) { return Iloggable.class.isAssignableFrom((Class<?>) actualTypeArgs[0]); } } return false; }
内容的提问来源于stack exchange,提问作者Dindar
相关产品推荐
相关产品推荐

