Spring下自定义xml标签

10 篇文章 1 订阅

今天尝试在spring框架下自定义一个标签,为以后定义一组标签,来控制流程处理做准备。

自定义一个标签需要以下步骤:

  1. 确定标签的属性,编写对应的java bean
  2. 根据java bean编写对应xsd文件
  3. 编写标签注册类NamespaceHandler和标签解析类BeanDefinitionParser
  4. 配置spring.handlers和spring.schmas
  5. 在spring的配置文件中使用标签

第一步:编写对应的java bean
我计划定一个标签facade,其属性包括id,interCode,reqEvent,resEvent
所以我的java bean如下:

public class Facade {

    private String id;

    private String interCode;

    private String reqEvent;

    private String resEvent;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getInterCode() {
        return interCode;
    }

    public void setInterCode(String interCode) {
        this.interCode = interCode;
    }

    public String getReqEvent() {
        return reqEvent;
    }

    public void setReqEvent(String reqEvent) {
        this.reqEvent = reqEvent;
    }

    public String getResEvent() {
        return resEvent;
    }

    public void setResEvent(String resEvent) {
        this.resEvent = resEvent;
    }

}

第二步:根据java bean编写对应xsd文件
对应的xsd文件如下:

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns="http://www.luxy.org/li" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans" targetNamespace="http://www.luxy.org/li" elementFormDefault="qualified" attributeFormDefault="unqualified">

    <xsd:import namespace="http://www.springframework.org/schema/beans" />

    <xsd:element name="facade" type="facadeType"></xsd:element>
    <xsd:complexType name="facadeType">
        <xsd:attribute name="id" type="xsd:ID" use="required" />
        <xsd:attribute name="interCode" type="xsd:string"></xsd:attribute>
        <xsd:attribute name="reqEvent" type="xsd:string"></xsd:attribute>
        <xsd:attribute name="resEvent" type="xsd:string"></xsd:attribute>
    </xsd:complexType>

</xsd:schema>

第三步:编写标签注册类NamespaceHandler和标签解析类BeanDefinitionParser

NamespaceHandler:

import org.springframework.beans.factory.xml.NamespaceHandlerSupport;

import com.slys.core.schema.parser.FacadeParser;

public class LiNamespaceHandler extends NamespaceHandlerSupport {

  public void init()
  {
      registerBeanDefinitionParser("facade", new FacadeParser());
  }

}

BeanDefinitionParser:

public class FacadeParser extends AbstractSimpleBeanDefinitionParser {

    @Override
    protected Class<Facade> getBeanClass(Element element) {
        return Facade.class;
    }

    protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
        try
        {
            builder.addPropertyValue("id", element.getAttribute("id"));
            builder.addPropertyValue("interCode", element.getAttribute("interCode"));
            builder.addPropertyValue("reqEvent",  element.getAttribute("reqEvent"));

            builder.addPropertyValue("resEvent", element.getAttribute("resEvent"));

        } catch (Exception e) {
          parserContext.getReaderContext().error("class " + FacadeParser.class.getName() + " can not be create", element, null, e);
        } 
      }
}

第四步:配置spring.handlers和spring.schmas

spring.handlers:

http\://www.luxy.org/li=com.slys.core.schema.LiNamespaceHandler

spring.schemas:

http\://www.luxy.org/li.xsd=com/slys/core/schema/li.xsd

第五步:在spring的配置文件中使用标签

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:li="http://www.luxy.org/li" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.luxy.org/li http://www.luxy.org/li.xsd">

    <li:facade id="abcd" interCode="1234" reqEvent="test" resEvent="res"></li:facade>

</beans>

大功告成!!!

测试:

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-config.xml");

        Facade facade = (Facade) context.getBean("abcd");
        System.out.println(facade.getId());
        System.out.println(facade.getInterCode());
        System.out.println(facade.getReqEvent());
        System.out.println(facade.getResEvent());
    }

输出结果:

abcd
1234
test
res

在尝试过程中遇到的问题:
1、xsd中没有加id属性,报错:cvc-complex-type.3.2.2: 元素 ‘li:facade’ 中不允许出现属性 ‘id’,加上后错误消失
2、id的值使用“1234”,报错:cvc-datatype-valid.1.2.1: ‘1234’ 不是 ‘NCName’ 的有效值,理解为不能使用纯数字为id赋值
3、spring.handlers和spring.schmas的存放位置,放在src/main/resources目录下,新建META-INF文件夹
4、使用maven打jar包时,发现不能将li.xsd文件打进去jar中,解决办法:

在pom.xml增加

<build>
     <resources>
         <resource>
             <directory>src/main/resources</directory>
             <includes>
                 <include>**/*.*</include>
             </includes>
         </resource>
         <resource>
             <directory>src/main/java</directory>
             <includes>
                 <include>**/*.xml</include>
                 <include>**/*.xsd</include>
             </includes>
         </resource>
     </resources>
 </build>
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security中,通过配置访问控制列表(Access Control List,ACL)来实现授权规则。授权规则可以在Spring Security的XML配置文件中定义。 以下是一个示例配置文件,其中定义了两个授权规则: ``` <http auto-config="true"> <intercept-url pattern="/admin/**" access="ROLE_ADMIN" /> <intercept-url pattern="/**" access="ROLE_USER" /> <form-login /> </http> <authentication-manager> <authentication-provider> <user-service> <user name="user" password="password" authorities="ROLE_USER" /> <user name="admin" password="password" authorities="ROLE_ADMIN" /> </user-service> </authentication-provider> </authentication-manager> ``` 上述配置文件中,`<http>` 标签用于配置访问控制规则,其中 `<intercept-url>` 标签用于定义 URL 匹配模式和对应的授权规则。此处定义了两个规则:对于 `/admin/**` 的请求,要求用户拥有 `ROLE_ADMIN` 角色;对于其他所有请求,要求用户拥有 `ROLE_USER` 角色。 `<authentication-manager>` 标签用于配置身份认证的方式,此处使用了内存中的用户信息进行认证。 如果要自定义授权规则,可以实现 `AccessDecisionVoter` 接口,并将自定义的投票器配置到 `<http>` 标签中: ``` <http auto-config="true"> <intercept-url pattern="/admin/**" access="ROLE_ADMIN" /> <intercept-url pattern="/**" access="ROLE_USER" /> <form-login /> <access-decision-manager> <decision-voters> <bean class="com.example.CustomVoter" /> </decision-voters> </access-decision-manager> </http> ``` 以上配置文件中,`<access-decision-manager>` 标签用于配置访问决策管理器,其中 `<decision-voters>` 标签用于定义投票器列表。`<bean>` 标签用于定义自定义投票器的实现类。在自定义投票器中,可以编写自己的授权规则逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值