我在使用 Spring Argument 決議器和HandlerMethodArgumentResolver時遇到 java.lang.IllegalArgumentException: argument type mismatch 。多次除錯我的代碼,但能夠找到為什么會出現此例外。如果有人能幫我解決這個問題,那就太好了。這是我的代碼。
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;
}
uj5u.com熱心網友回復:
你SpringArgumentResolver錯了。AGetDataRequest是 aCommonHeader但 aCommonHeader不是GetDataRequest。你SpringArgumentResolver 總是回傳一個CommonDataHeader不能被強制轉換/變成一個GetDataRequest因此錯誤。
CommonHeader header = new CommonHeader();
GetDataRequest request = (GetDataRequest) header;
基本上是您預期會自動發生的事情。現在這在常規 java 中不起作用(導致 a ClassCastException)為什么它應該在 Spring 中?Spring 會檢查結果物件是否可以分配給該方法引數,在這種情況下 in not 因為GetDataRequest.isAssignableFrom(CommonHeader.class);將回傳false(盡管相反的是真的!)。
您應該做的SpringArgumentResolver是動態確定類并實體化它,將其轉換為CommonHeader并設定欄位。
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
CommonHeader commonHeader = BeanUtils.instantiateClass(parameter.getParameterType(), CommonHeader.class);
String user_id = webRequest.getHeader("UserID");
commonHeader.setUser_id(user_id);
return commonHeader;
}
這將使用方法引數的實際型別來創建一個實體,從而消除ClassCastExceptionSpring 的 和IllegalArgumentException.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/328953.html
下一篇:請求的資源[/]不可用
