【发布时间】:2021-11-20 08:57:28
【问题描述】:
我在使用带有 HandlerMethodArgumentResolver 的 Spring Argument 解析器时遇到 java.lang.IllegalArgumentException:参数类型不匹配。多次调试我的代码,但能够找到为什么会出现这个异常。如果有人可以帮助我,那就太好了。 这是我的代码。
public final class SpringArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return CommonHeader.class.isAssignableFrom(parameter.getParameterType());
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
CommonHeader commonHeader = new CommonHeader();
String user_id = webRequest.getHeader("UserID");
commonHeader.setUser_id(user_id);
return commonHeader;
}
配置类:
@Configuration
@EnableWebMvc
public class SpringWebMvcConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new SpringArgumentResolver());
}
}
CommonHeader 类:
public class CommonHeader {
private String user_id;
private String ip_address;
private String request_id;
public CommonHeader(String user_id) {
this.user_id = user_id;
}
public CommonHeader(){}
public String getUser_id() {
return user_id;
}
public void setUser_id(String user_id) {
this.user_id = user_id;
}
}
控制器:
@GetMapping("user_data")
public DeferredResult<ResponseEntity<JsonNode>> getUserPreferenceData(GetDataRequest getDataRequest) {
DeferredResult<ResponseEntity<JsonNode>> deferredResult = new DeferredResult<>();
// some logic
// some logic
return deferredResult;
}
扩展 CommonHeader 类的请求类:
@Getter
@Setter
public class GetDataRequest extends CommonHeader {
private String name1;
private String name2;
}
【问题讨论】:
-
问题是什么?您的
GetNotificationPrefrenceDataRequest没有在该代码中使用,那么为什么要使用转换器? -
只是输入错误,如本示例代码。标头的某些字段对于我的项目的所有 API 都是通用的。所以我正在应用这个参数解析器代码来优化代码。
-
SpringArgumentResolver类中return语句后出现异常,return commonHeader;
-
那么你认为
CommonHeader会自动变成GetDataRequest吗?执行GetDataRequest req = (GetDataRequest) new CommonHeader();(即,将COmmonHeader转换为GetDataRequest)也会在常规java 中导致ClassCastException。那么为什么会有所不同。需要从MethodParameter中判断类型,动态构造实例。 -
但是 spring webflux 项目的相同逻辑正在使用少量更改。 github.com/martinnemec3/spring-argument-resolver-demo/blob/main/…
标签: java spring-boot spring-mvc illegalargumentexception