参考地址:https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc
源码地址:https://gitee.com/qinshizhang/spring-mvc-learn
返回信息如下:
<body><h1>HTTP状态 400 - 错误的请求</h1>
<hr class="line"/>
<p><b>类型</b> 状态报告</p>
<p><b>描述</b> 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求。</p>
<hr class="line"/>
<h3>Apache Tomcat/9.0.41</h3></body>
情况一、获取Long类型的参数
在不使用@InitBinder注册用户的自定义的java.beans.PropertyEditor类型情况
Java代码如下:
@RestController
@RequestMapping(path = "v1/hello/")
public class HelloController {
@GetMapping(path = "showLong/{userId}")
public long showLong(@PathVariable long userId) {
return userId;
}
}
请求参数如下:
### 测试long类型
GET http://localhost:9090/v1/hello/showLong/12345L
Accept: application/json
源码跟踪关键流程。
org.springframework.validation.DataBinder#convertIfNecessary(java.lang.Object, java.lang.Class<T>, org.springframework.core.MethodParameter)
---->
org.springframework.beans.TypeConverterSupport#convertIfNecessary(java.lang.Object, java.lang.Class<T>, org.springframework.core.MethodParameter)
---->
org.springframework.beans.TypeConverterSupport#convertIfNecessary(java.lang.Object, java.lang.Class<T>, org.springframework.core.convert.TypeDescriptor)
---->
org.springframework.beans.TypeConverterDelegate#convertIfNecessary(java.lang.String, java.lang.Object, java.lang.Object, java.lang.Class<T>, org.springframework.core.convert.TypeDescriptor)
---->
org.springframework.core.convert.support.GenericConversionService#convert(java.lang.Object, org.springframework.core.convert.TypeDescriptor, org.springframework.core.convert.TypeDescriptor)
---->
org.springframework.core.convert.support.ConversionUtils#invokeConverter
---->
org.springframework.core.convert.support.GenericConversionService.ConverterFactoryAdapter#convert
---->
org.springframework.core.convert.support.StringToNumberConverterFactory.StringToNumber#convert
---->
org.springframework.util.NumberUtils#parseNumber(java.lang.String, java.lang.Class<T>)
org.springframework.util.NumberUtils#parseNumber(java.lang.String, java.lang.Class<T>)的源码如下:
public static <T extends Number> T parseNumber(String text, Class<T> targetClass) {
Assert.notNull(text, "Text must not be null");
Assert.notNull(targetClass, "Target class must not be null");
String trimmed = StringUtils.trimAllWhitespace(text);
if (Byte.class == targetClass) {
return (T) (isHexNumber(trimmed) ? Byte.decode(trimmed) : Byte.valueOf(trimmed));
}
else if (Short.class == targetClass) {
return (T) (isHexNumber(trimmed) ? Short.decode(trimmed) : Short.valueOf(trimmed));
}
else if (Integer.class == targetClass) {
return (T) (isHexNumber(trimmed) ? Integer.decode(trimmed) : Integer.valueOf(trimmed));
}
else if (Long.class == targetClass) {
return (T) (isHexNumber(trimmed) ? Long.decode(trimmed) : Long.valueOf(trimmed));
}
else if (BigInteger.class == targetClass) {
return (T) (isHexNumber(trimmed) ? decodeBigInteger(trimmed) : new BigInteger(trimmed));
}
else if (Float.class == targetClass) {
return (T) Float.valueOf(trimmed);
}
else if (Double.class == targetClass) {
return (T) Double.valueOf(trimmed);
}
else if (BigDecimal.class == targetClass || Number.class == targetClass) {
return (T) new BigDecimal(trimmed);
}
else {
throw new IllegalArgumentException(
"Cannot convert String [" + text + "] to target