栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何实现@RequestMapping自定义属性

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何实现@RequestMapping自定义属性

我已经创建了基于引用的spring-mvc-31-demo的解决方案

到目前为止,此解决方案只能用于映射单个RequestCondition。我创建了两个要通知的问题,应该对此进行更改:
https : //github.com/rstoyanchev/spring-mvc-31-demo/issues/5
https://jira.springsource.org/browse/SPR-9350

该解决方案使用Spring 3.1.1.RELEASE平台的自定义@RequestCondition功能

用法

范例1:

@Controller@SubdomainMapping(value = "subdomain", tld = ".mydomain.com")class MyController1 {    // Code here will be executed only on address match:    // subdomain.mydomain.com}

范例2:

@Controllerclass MyController2 {    @RequestMapping("/index.html")    @SubdomainMapping("www")    public function index_www(Map<Object, String> map){        // on www.domain.com        // where ".domain.com" is defined in SubdomainMapping.java    }    @RequestMapping("/index.html")    @SubdomainMapping("custom")    public function index_custom(Map<Object, String> map){        // on custom.domain.com        // where ".domain.com" is defined in SubdomainMapping.java    }}

我们需要三个文件

  • SubdomainMapping.java
  • SubdomainRequestCondition.java
  • SubdomainRequestMappingHandlerMapping.java

SubdomainMapping.java

import java.lang.annotation.documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface SubdomainMapping {        String[] value() default {};        String tld() default ".custom.tld";}

SubdomainRequestCondition.java

import java.net.URL;import java.util.Arrays;import java.util.Collection;import java.util.Collections;import java.util.HashSet;import java.util.linkedHashSet;import java.util.Set;import javax.servlet.http.HttpServletRequest;import org.springframework.web.servlet.mvc.condition.RequestCondition;public class SubdomainRequestCondition implements        RequestCondition<SubdomainRequestCondition> {    private final Set<String> subdomains;    private final String tld;    public SubdomainRequestCondition(String tld, String... subdomains) {        this(tld, Arrays.asList(subdomains));    }    public SubdomainRequestCondition(String tld, Collection<String> subdomains) {        this.subdomains = Collections.unmodifiableSet(new HashSet<String>(     subdomains));        this.tld = tld;    }    @Override    public SubdomainRequestCondition combine(SubdomainRequestCondition other) {        Set<String> allRoles = new linkedHashSet<String>(this.subdomains);        allRoles.addAll(other.subdomains);        return new SubdomainRequestCondition(tld, allRoles);    }    @Override    public SubdomainRequestCondition getMatchingCondition( HttpServletRequest request) {        try { URL uri = new URL(request.getRequestURL().toString()); String[] parts = uri.getHost().split(this.tld); if (parts.length == 1) {     for (String s : this.subdomains) {         if (s.equalsIgnoreCase(parts[0])) {  return this;         }     } }        } catch (Exception e) { e.printStackTrace(System.err);        }        return null;    }    @Override    public int compareTo(SubdomainRequestCondition other, HttpServletRequest request) {        return org.apache.commons.collections.CollectionUtils.removeAll(other.subdomains, this.subdomains).size();    }}

SubdomainRequestMappingHandlerMapping.java

import java.lang.reflect.Method;import org.springframework.core.annotation.AnnotationUtils;import org.springframework.web.servlet.mvc.condition.RequestCondition;import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;public class CustomRequestMappingHandlerMapping extends        RequestMappingHandlerMapping {    @Override    protected RequestCondition<?> getCustomTypeCondition(Class<?> handlerType) {        SubdomainMapping typeAnnotation = AnnotationUtils.findAnnotation(     handlerType, SubdomainMapping.class);        return createCondition(typeAnnotation);    }    @Override    protected RequestCondition<?> getCustomMethodCondition(Method method) {        SubdomainMapping methodAnnotation = AnnotationUtils.findAnnotation(     method, SubdomainMapping.class);        return createCondition(methodAnnotation);    }    private RequestCondition<?> createCondition(SubdomainMapping accessMapping) {        return (accessMapping != null) ? new SubdomainRequestCondition(     accessMapping.tld(), accessMapping.value()) : null;    }}

安装方式

重要说明:到目前为止,无法将此解决方案与XML元素
一起使用,请参见JIRA https://jira.springsource.org/browse/SPR-9344以获取解释。

  • 你必须注册自定义
    MappingHandler bean
    ,指向此自定义实现SubdomainRequestMappingHandlerMapping类。
  • 你必须将其订单设置为低于默认订单,
    RequestMappingHandlerMapping


    替换已注册的
    RequestMappingHandlerMapping
    订单(可能在order = 0上)
    有关实现此解决方案的更多说明,请参见相关的github项目。


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/386379.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号