参考资料:
http://jinnianshilongnian.iteye.com/blog/1723270
http://www.bubuko.com/infodetail-1428732.html
使用spring类型转换器注册器、类型转换服务:提供类型转换器注册支持,运行时类型转换API支持。
1、ConverterRegistry:类型转换器注册支持,可以注册/删除相应的类型转换器。
2、ConversionService:运行时类型转换服务接口,提供运行期类型转换的支持。
Spring提供了两个默认实现(其都实现了ConverterRegistry、ConversionService接口):
DefaultConversionService:默认的类型转换服务实现;
DefaultFormattingConversionService:带数据格式化支持的类型转换服务实现,一般使用该服务实现即可。
问题:
比如 参数为Integer 为空或非数字 则默认为负数,返回
条件:Integer 负数 没有任何意义或者参数非法的定义
查询spring
StringToNumberConverterFactory String----->Number(如Integer、Long等)
创建类实现Converter接口,例如返回MyStringToIntegerConverter对Integer类型进行必要的处理
package com.jyt.advice; import org.springframework.core.convert.converter.Converter; public class MyStringToIntegerConverter implements Converter<String, Integer> { @Override public Integer convert(String source) { System.out.println("转换前---------StringTOInteger转换:" + source); if (source.length() == 0) { return -1; } boolean isnumber = org.apache.commons.lang.StringUtils.isNumeric(source); source = isnumber == true ? source : "-1"; System.out.println("转换后---------StringTOInteger转换:" + Integer.valueOf(source)); return Integer.valueOf(source); } }
Spring 配置:
<mvc:annotation-driven conversion-service="conversionService"/> <!-- 注册ConversionService --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="com.jyt.advice.MyStringToIntegerConverter"/> </list> </property> </bean>
对数字类工厂转换:
package com.jyt.advice; import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.ConverterFactory; public class MyStringToNumberConverterFactory implements ConverterFactory<String, Number> { @Override public <T extends Number> Converter<String, T> getConverter(Class<T> targetType) { return new StringToNumber<T>(targetType); } private static final class StringToNumber<T extends Number> implements Converter<String, T> { private final Class<T> targetType; public StringToNumber(Class<T> targetType) { this.targetType = targetType; } @Override public T convert(String source) { System.out.println("启动自定义的Integer转换类型转化器"); if (source.length() == 0) { return null; } return MyNumberUtils.myParseNumber(source, this.targetType); } } } package com.jyt.advice; import java.math.BigDecimal; import java.math.BigInteger; import org.springframework.util.Assert; import org.springframework.util.NumberUtils; import org.springframework.util.StringUtils; public class MyNumberUtils extends NumberUtils { @SuppressWarnings("unchecked") public static <T extends Number> T myParseNumber(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 (targetClass.equals(Byte.class)) { return (T) (isHexNumber(trimmed) ? Byte.decode(trimmed) : Byte.valueOf(trimmed)); } else if (targetClass.equals(Short.class)) { return (T) (isHexNumber(trimmed) ? Short.decode(trimmed) : Short.valueOf(trimmed)); } else if (targetClass.equals(Integer.class)) { System.out.println("StringTOInteger转换"); boolean isnumber = org.apache.commons.lang.StringUtils.isNumeric(text); text = isnumber == true ? text : "-1"; return (T) (isHexNumber(trimmed) ? Integer.decode(trimmed) : Integer.valueOf(trimmed)); } else if (targetClass.equals(Long.class)) { System.out.println("StringTOLong转换"); boolean isnumber = org.apache.commons.lang.StringUtils.isNumeric(text); text = isnumber == true ? text : "-1"; return (T) (isHexNumber(trimmed) ? Long.decode(trimmed) : Long.valueOf(trimmed)); } else if (targetClass.equals(BigInteger.class)) { System.out.println("StringTOBigInteger转换"); boolean isnumber = org.apache.commons.lang.StringUtils.isNumeric(text); text = isnumber == true ? text : "-1"; return (T) (isHexNumber(trimmed) ? decodeBigInteger(trimmed) : new BigInteger(trimmed)); } else if (targetClass.equals(Float.class)) { return (T) Float.valueOf(trimmed); } else if (targetClass.equals(Double.class)) { return (T) Double.valueOf(trimmed); } else if (targetClass.equals(BigDecimal.class) || targetClass.equals(Number.class)) { return (T) new BigDecimal(trimmed); } else { throw new IllegalArgumentException("Cannot convert String [" + text + "] to target class [" + targetClass.getName() + "]"); } } /** * Determine whether the given value String indicates a hex number, i.e. needs to be * passed into <code>Integer.decode</code> instead of <code>Integer.valueOf</code> (etc). */ private static boolean isHexNumber(String value) { int index = (value.startsWith("-") ? 1 : 0); return (value.startsWith("0x", index) || value.startsWith("0X", index) || value.startsWith("#", index)); } /** * Decode a {@link java.math.BigInteger} from a {@link String} value. * Supports decimal, hex and octal notation. * * @see BigInteger#BigInteger(String, int) */ private static BigInteger decodeBigInteger(String value) { int radix = 10; int index = 0; boolean negative = false; // Handle minus sign, if present. if (value.startsWith("-")) { negative = true; index++; } // Handle radix specifier, if present. if (value.startsWith("0x", index) || value.startsWith("0X", index)) { index += 2; radix = 16; } else if (value.startsWith("#", index)) { index++; radix = 16; } else if (value.startsWith("0", index) && value.length() > 1 + index) { index++; radix = 8; } BigInteger result = new BigInteger(value.substring(index), radix); return (negative ? result.negate() : result); } }
Spring 配置:
<mvc:annotation-driven conversion-service="conversionService"/> <!-- 注册ConversionService --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="com.jyt.advice.MyStringToNumberConverterFactory"/> </list> </property> </bean>
相关推荐
在这种情况下,我们需要兼容这两种ContentType提交方式的请求体。 在响应结果中,我们同样需要对响应结果进行加密。为了简单起见,我们可以采用同样的AES对称秘钥为"throwable"进行加密。 在Spring MVC中,我们...
SPRING MVC 请求参数获取的几种方法 SPRING MVC 框架中,获取请求参数是非常重要的一步,下面将介绍 SPRING MVC ...SPRING MVC 提供了多种方法来获取请求参数,开发者可以根据实际情况选择合适的方法来获取请求参数。
高级参数绑定是指在Controller方法中,Spring MVC能够自动将请求参数绑定到方法参数上,包括基本类型、复杂对象甚至自定义类型。例如,可以使用`@RequestParam`、`@PathVariable`、`@RequestHeader`、`@RequestBody`...
在处理HTTP请求时,Spring MVC 提供了参数绑定功能,将HTTP请求中的参数映射到控制器方法的参数上,使得开发更加便捷。然而,这个特性也可能导致安全问题,特别是参数绑定漏洞。 参数绑定漏洞通常出现在以下情况: ...
通过这种方式,Spring AOP可以帮助我们在不修改控制器代码的情况下,轻松地实现对非法请求路径的拦截和处理。这不仅提高了代码的可维护性,也使得安全策略可以集中管理和更新。记住,这只是一个基本的示例,实际应用...
Spring AOP(面向切面编程)提供了一种优雅的方式来实现这一需求,它允许我们在不修改原有代码的情况下,插入额外的功能。本教程将通过一个具体的例子来介绍如何使用Spring AOP在Spring Boot中打印Web请求的参数信息...
当请求参数不符合预期(如类型转换失败或必须的参数缺失)时,Spring MVC会抛出异常。我们可以使用`@ExceptionHandler`注解来处理这些异常,提供自定义的错误响应。 7. **国际化** 对于多语言环境,Spring MVC...
本文将深入探讨四种主要的URL请求方式,包括HTTP基础请求方法以及Spring框架中的请求工具类。我们将讨论它们的工作原理、优缺点以及如何在实际开发中灵活运用。 1. HTTP基础请求方法: - GET:最常用的方法,用于...
通过`@RequestBody`注解,Spring MVC会尝试将请求体转换为相应的Java对象: ```java @PostMapping("/create") public ResponseEntity createUser(@RequestBody User user) { // ... } ``` 6. **模型和视图...
SpringBoot+SpringSecurity处理Ajax登录请求问题 SpringBoot+SpringSecurity处理Ajax登录请求问题是SpringBoot开发中的一個常见问题,本文将详细介绍如何使用SpringBoot+SpringSecurity处理Ajax登录请求问题。 ...
同时,Spring框架提供的线程池功能则可以帮助我们优化多线程环境下的性能,特别是处理并发请求时。在这个主题中,我们将深入探讨如何利用Spring MVC与Spring线程池来有效地管理并发请求,并解决数据同步控制问题。 ...
同时,由于FormData和Body只能读取一次,因此在读取后,我们需要重新包装`ServerHttpRequest`和`ServerHttpResponse`以确保请求能正常传递到下游服务: ```java @Override public Mono<Void> filter...
这种方法适用于 JSON 格式的请求体,通过 `@RequestBody` 注解,Spring MVC 可以自动将请求体中的 JSON 数据转换为 Java 对象。 #### 总结 以上介绍了三种解决 Spring MVC 无法直接接收 List 类型参数的方法。这些...
springboot中参数进行驼峰与下划线的自动转换配置,实现参数传入时是下划线、java后台接收变成驼峰、返回前端又转为下划线
当请求参数与控制器方法参数类型不完全匹配时,Spring MVC会尝试进行默认转换。例如,字符串"true"会被自动转换为布尔值true。如果转换失败,Spring MVC会抛出异常。 3. **POJO类型**: 对于复杂的Java对象,可以...
`HttpServletRequestWrapper` 是Servlet API中的一个抽象类,它是`HttpServletRequest` 的包装类,可以用来扩展或修改原始请求对象的功能。 标题“使用HttpServletRequestWrapper在filter修改request参数”揭示了...
Spring MVC请求参数接收的全面总结教程 Spring MVC框架中,请求参数接收是一个非常重要的主题,今天我们将对Spring MVC请求参数接收进行详细的总结和介绍。 首先,Spring MVC中处理控制器参数的接口是...
Spring提供了`OncePerRequestFilter`抽象类,它是对传统`Filter`的一个封装,确保每个请求只被过滤一次,避免了在多线程环境下的并发问题。然而,如果在处理JSON类型的POST请求时,直接在Filter中打印请求参数,可能...
在Spring+CXF的环境中,XML请求通常是通过Java对象转换得到的。CXF提供了JAXB(Java Architecture for XML Binding)支持,可以将Java对象自动转换为XML,反之亦然。因此,调用Web服务方法时,传入Java对象,CXF会...