当前位置: 首页 > 知识库问答 >
问题:

IllegalArgumentException:使用Spring自定义参数解析器时参数类型不匹配

元彦君
2023-03-14
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());
    }

}
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;
    }
@Getter
@Setter
public class GetDataRequest extends CommonHeader {

    private String name1;
    private String name2;
   
}

共有1个答案

徐景明
2023-03-14

您的SpringArgumentResolver错误。GetDataRequestCommonHeader,但CommonHeader不是GetDataRequest。您的SpringArgumentResolver总是返回一个CommonDataHeader,该CommonDataHeader,不能转换成GetDataRequest,因此出现错误。

CommonHeader header = new CommonHeader();
GetDataRequest request = (GetDataRequest) header;

基本上就是你所期望的会自动发生的事情。现在,这在常规java中不起作用(导致ClassCastException),为什么在Spring中要起作用呢?Spring会检查结果对象是否可以分配给该方法参数,在本例中是因为getDataRequest.isAssignableFrom(commonheader.class);返回false(尽管相反是true!)。

SpringArgumentResolver中应该做的是动态确定类并实例化它,将其强制转换为CommonHeader并设置字段。

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {

    CommonHeader commonHeader = BeanUtils.instantiateClass(parameter.getParameterType());
    String user_id = webRequest.getHeader("UserID");
    commonHeader.setUser_id(user_id);
    return commonHeader;
}
 类似资料:
  • 我正在编写一个学习反射的示例应用程序。我试图使用反射从另一个类调用一个类中定义的主方法,但我得到了 线程“main”java中出现异常。lang.IllegalArgumentException:参数类型不匹配 在下面查找我正在尝试执行的代码。 调用main方法的类 要调用其主方法的类

  • 我试图更新一个实体与OneToOne关系使用restful Web服务。 我使用自定义查询,但它不工作 错误: java.lang.的参数值[2]不匹配预期的类型[com.mezoo.tdc.model.ActivityType(n/a)] 活动豆 豆子 它是可能的更新没有自定义查询?我想使用下面的POST请求: {"uuid":"9d9fa946-ee6e-408e-9e8a-7a9786a1d

  • 本文向大家介绍Spring boot中自定义Json参数解析器的方法,包括了Spring boot中自定义Json参数解析器的方法的使用技巧和注意事项,需要的朋友参考一下 一、介绍 用过springMVC/spring boot的都清楚,在controller层接受参数,常用的都是两种接受方式,如下 第一个就是前端传json参数,后台使用RequestBody注解来接受参数。第二个就是普通的get

  • 我试图理解为什么当我在MyModel中为T使用更高类型的参数时,以下代码无法编译 但是如果我把它改成< code > new Bar[my model[Any]]它就会编译。这是为什么呢?

  • 问题内容: 如何接受自定义类型查询参数? 上面的行在启动服务器时给出错误 问题答案: 查看有关注入的可接受类型的文档。(这同样适用于所有其他注释) 是原始类型 有一个接受单个String参数的构造函数 有一个名为或的静态方法,该方法接受单个String参数(例如,参见) 已注册ParamConverterProvider JAX-RS扩展SPI的实现,该扩展返回一个ParamConverter实例

  • 我试图创建一个以记录类型为参数的过程。我的问题是,我不能在过程之前定义我的类型,它说我的类型没有声明。。我该怎么做? 这是我的代码: 错误(1,29):PLS-00201:必须声明标识符“TIP”