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;
}
您的SpringArgumentResolver
错误。GetDataRequest
是CommonHeader
,但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”