根据这个答案,我尝试编写代码:
pojo:
class MyBean{
public String getValueName() {
return valueName;
}
public void setValueName(String valueName) {
this.valueName = valueName;
}
String valueName;
}
内部控制器:
@ModelAttribute
public MyBean createMyBean() {
return new MyBean();
}
@RequestMapping(value = "/getMyBean", method = RequestMethod.GET)
public String getMyBean(@ModelAttribute MyBean myBean) {
System.out.println(myBean.getValueName());
return "pathToJsp";
}
网状物xml配置:
<filter>
<filter-name>caseInsensitiveFilter</filter-name>
<filter-class>com.terminal.interceptor.CaseInsensitiveRequestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>caseInsensitiveFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
过滤器:
@Component
public class CaseInsensitiveRequestFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
filterChain.doFilter(new CaseInsensitiveHttpServletRequestWrapper(request), response);
}
private static class CaseInsensitiveHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final LinkedCaseInsensitiveMap params = new LinkedCaseInsensitiveMap();
/**
* Constructs a request object wrapping the given request.
*
* @param request
* @throws IllegalArgumentException if the request is null
*/
private CaseInsensitiveHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
params.putAll(request.getParameterMap());
}
@Override
public String getParameter(String name) {
String[] values = getParameterValues(name);
if (values == null || values.length == 0) {
return null;
}
return values[0];
}
@Override
public Map getParameterMap() {
return Collections.unmodifiableMap(this.params);
}
@Override
public Enumeration getParameterNames() {
return Collections.enumeration(this.params.keySet());
}
@Override
public String[] getParameterValues(String name) {
return (String[]) params.get(name);
}
}
}
在debug中,我看到filter方法调用,但我无法实现case-insentive-get-parameters映射。
例如localhost:8081/getMyBean?valueName=trololo
可以工作,但是localhost:8081/getMyBean?valuename=trololo
-不
实际上,您必须根据bean变量名更改CaseInsensitiveRequestFilter
类中的内容。在您的情况下,变量是valueName
,因此对于每个请求,它都将根据变量设置器方法camel case INPUTION对其进行转换,然后根据您的请求进行匹配。只需满足您的定制要求:
package biz.deinum.web.filter;
import java.io.IOException;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.LinkedCaseInsensitiveMap;
import org.springframework.web.filter.OncePerRequestFilter;
public class CaseInsensitiveRequestFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
filterChain.doFilter(new CaseInsensitiveHttpServletRequestWrapper(request), response);
}
private static class CaseInsensitiveHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final LinkedCaseInsensitiveMap<String[]> params = new LinkedCaseInsensitiveMap<>();
private CaseInsensitiveHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
Map<String, String[]> map = request.getParameterMap();
Set set = map.entrySet();
Iterator it = set.iterator();
Map<String, String[]> tempMap = new HashMap<String, String[]>();
while (it.hasNext()) {
Map.Entry<String, String[]> entry = (Entry<String, String[]>) it.next();
String key = entry.getKey();
// Keep your parameter bean name here in your case it is "valueName"
String beanParamaterName = "valueName";
if(key.equalsIgnoreCase(beanParamaterName)){
tempMap.put(key.toLowerCase(), entry.getValue());
}
}
params.putAll(tempMap);
}
@Override
public String getParameter(String name) {
String[] values = getParameterValues(name);
System.out.println(values.toString()+"-");
if (values == null || values.length == 0) {
return null;
}
return values[0];
}
@Override
public Map<String, String[]> getParameterMap() {
return Collections.unmodifiableMap(this.params);
}
@Override
public Enumeration<String> getParameterNames() {
return Collections.enumeration(this.params.keySet());
}
@Override
public String[] getParameterValues(String name) {
System.out.println(name);
return (String[])params.get(name);
}
}
}
这是你能做的。。。
使用所有小写变量创建域(POJO)
public class MyBean{
private String valuename;
public String getValuename() {
return valuename;
}
public void setValuename(String valuename) {
this.valuename = valuename;
}
}
然后创建一个类,它将扩展HttpServletquiestWrapper
public class CustomWrappedRequest extends HttpServletRequestWrapper
{
private final Map<String, String[]> modifiableParameters;
private Map<String, String[]> allParameters = null;
public CustomWrappedRequest(final HttpServletRequest request,
final Map<String, String[]> additionalParams)
{
super(request);
modifiableParameters = new TreeMap<String, String[]>();
modifiableParameters.putAll(additionalParams);
}
@Override
public String getParameter(final String name)
{
String[] strings = getParameterMap().get(name);
if (strings != null)
{
return strings[0];
}
return super.getParameter(name);
}
@Override
public Map<String, String[]> getParameterMap()
{
if (allParameters == null)
{
allParameters = new TreeMap<String, String[]>();
allParameters.putAll(super.getParameterMap());
allParameters.putAll(modifiableParameters);
}
return Collections.unmodifiableMap(allParameters);
}
@Override
public Enumeration<String> getParameterNames()
{
return Collections.enumeration(getParameterMap().keySet());
}
@Override
public String[] getParameterValues(final String name)
{
return getParameterMap().get(name);
}
}
最后添加一个带有适当web的筛选器。xml配置doFilter()
如下所示
public void doFilter(ServletRequest request, ServletResponse reponse, FilterChain chain)
throws IOException, ServletException {
Map<String, String[]> params = request.getParameterMap();
Map<String, String[]> extraParams = new TreeMap<String, String[]>();
Iterator<String> i = params.keySet().iterator();
while ( i.hasNext() )
{
String key = (String) i.next();
String value = ((String[]) params.get( key ))[ 0 ];
extraParams.put(key.toLowerCase(), new String[] {value});
}
HttpServletRequest wrappedRequest = new CustomWrappedRequest((HttpServletRequest)request, extraParams);
chain.doFilter(wrappedRequest, reponse);
}
在这里,过滤器将把参数转换成小写,并将其附加到您自定义的请求中。然后使用可以在控制器代码中使用@ModelAt0016
来获得所需的对象。
希望有帮助:)
你的问题,我相信,是@ModelAt0016
。您要求Spring将参数映射到MyBean对象,该对象中的属性是value eName
。
为了使Spring将参数反映到对象上,它的大小写必须正确。
你有2个选择:
value ename
,并将所有属性名更改为小写,这应该有助于您的解决方案。@ModelAt0016
,并为每个属性放置@recestParam
。如果你有很多道具,这可能会很痛苦。我需要一个像
对于报告(0.1%的所有查询),我需要返回一个所有可能类别的列表,区分大小写! 考虑以下文件: 运行以下查询: 返回: 是否有方法返回区分大小写的类别(存储在文档中)?我对此查询结果中的感兴趣。 Elasticsearch论坛中的问题 谢谢,伊泰
问题内容: 我正在尝试提出一个要求区分大小写的结果的请求。 例如在我的数据库中 该请求是 但我有3行作为结果,我只想要abcdef 我试图找到一个解决方案 但是我有这个错误: 未知归类:’Latin1_General_CS_AS’{“成功”:false,“错误”:“#1273-未知归类:’Latin1_General_CS_AS’”} 谢谢 问题答案: 感谢您的帮助,我找到了不是latin1 ut
问题内容: 我想按不区分名称的名称搜索用户表中的数据。 我收到一个错误: 意外令牌:% 。我应该在哪里放置“%”? 问题答案: 您可以使用concat运算符: 或使用命名参数: (使用Spring Boot 1.4.3测试)
问题内容: 我有一个充满小写和大写数据的json。例如 : 而且我有类似的东西: 我想做的是搜索朋友,而不用看大写和小写。因此,基本上,当我在输入中键入“ John”,“ JOHN”或简单地输入“ john”时,它应该返回我的朋友John。 那么是否可以将不区分大小写的选项应用于过滤器? 问题答案: 将您在使用字符串的toLowerCase的适用范围内定义的函数名称传递给您。参见ngFilter。
本文向大家介绍Fortran 不区分大小写,包括了Fortran 不区分大小写的使用技巧和注意事项,需要的朋友参考一下 示例 在Fortran字符集中,字母的大写和小写字母是等效的。换句话说,Fortran不区分大小写。此行为与区分大小写的语言(例如C ++和许多其他语言)形成对比。 结果,变量a和A是相同的变量。原则上可以编写如下程序 对于优秀的程序员来说,要避免这种丑陋的选择。