【问题标题】:<shiro:hasRole ..> Tag does not work cause NoSuchMethodException Exception<shiro:hasRole ..> 标签不起作用导致 NoSuchMethodException 异常
【发布时间】:2026-01-10 19:15:01
【问题描述】:

你能帮我解决我的问题吗,

我与 Apache Shiro 集成,一旦我使用 shiro:hasRole 标签或其他标签,就会抛出异常:

Caused by: java.lang.NoSuchMethodException: org.apache.shiro.web.tags.HasRoleTag.<init>(javax.faces.view.facelets.TagConfig)
    at java.lang.Class.getConstructor0(Class.java:2706)
    at java.lang.Class.getConstructor(Class.java:1657)
    at com.sun.faces.facelets.tag.AbstractTagLibrary$HandlerFactory.createHandler(AbstractTagLibrary.java:187)
    at com.sun.faces.facelets.tag.AbstractTagLibrary.createTagHandler(AbstractTagLibrary.java:678)
    at com.sun.faces.facelets.tag.CompositeTagLibrary.createTagHandler(CompositeTagLibrary.java:184)
    at com.sun.faces.facelets.compiler.TagUnit.createFaceletHandler(TagUnit.java:120)
    at com.sun.faces.facelets.compiler.TextUnit.createFaceletHandler(TextUnit.java:117)
    at com.sun.faces.facelets.compiler.CompilationUnit.getNextFaceletHandler(CompilationUnit.java:115)
    at com.sun.faces.facelets.compiler.TagUnit.getNextHandler(TagUnit.java:124)
    at com.sun.faces.facelets.tag.AbstractTagLibrary$ComponentConfigWrapper.getNextHandler(AbstractTagLibrary.java:230)
    at javax.faces.view.facelets.TagHandler.<init>(TagHandler.java:116)
    at javax.faces.view.facelets.MetaTagHandler.<init>(MetaTagHandler.java:105)
    at javax.faces.view.facelets.DelegatingMetaTagHandler.<init>(DelegatingMetaTagHandler.java:69)
    at javax.faces.view.facelets.ComponentHandler.<init>(ComponentHandler.java:128)
    at com.sun.faces.facelets.tag.jsf.html.HtmlComponentHandler.<init>(HtmlComponentHandler.java:75)
    at sun.reflect.GeneratedConstructorAccessor19.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.sun.faces.facelets.tag.AbstractTagLibrary$UserComponentHandlerFactory.createHandler(AbstractTagLibrary.java:306)
    at com.sun.faces.facelets.tag.AbstractTagLibrary.createTagHandler(AbstractTagLibrary.java:678)
    at com.sun.faces.facelets.tag.CompositeTagLibrary.createTagHandler(CompositeTagLibrary.java:184)
    at com.sun.faces.facelets.compiler.TagUnit.createFaceletHandler(TagUnit.java:120)
    at com.sun.faces.facelets.compiler.TextUnit.createFaceletHandler(TextUnit.java:117)
    at com.sun.faces.facelets.compiler.CompilationUnit.getNextFaceletHandler(CompilationUnit.java:115)
    at com.sun.faces.facelets.compiler.TagUnit.getNextHandler(TagUnit.java:124)
    at com.sun.faces.facelets.tag.AbstractTagLibrary$ComponentConfigWrapper.getNextHandler(AbstractTagLibrary.java:230)
    at javax.faces.view.facelets.TagHandler.<init>(TagHandler.java:116)
    at javax.faces.view.facelets.MetaTagHandler.<init>(MetaTagHandler.java:105)
    at javax.faces.view.facelets.DelegatingMetaTagHandler.<init>(DelegatingMetaTagHandler.java:69)
    at javax.faces.view.facelets.ComponentHandler.<init>(ComponentHandler.java:128)
    at com.sun.faces.facelets.tag.jsf.html.HtmlComponentHandler.<init>(HtmlComponentHandler.java:75)
    at sun.reflect.GeneratedConstructorAccessor19.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.sun.faces.facelets.tag.AbstractTagLibrary$UserComponentHandlerFactory.createHandler(AbstractTagLibrary.java:306)

请注意,我有一个正确的 shiro 配置,其中应用了 shiro 安全性并且资源受到保护,其中用户必须经过身份验证和授权才能访问应用程序资源。

但是一旦我尝试涉及 shiro 安全标签,就会看到异常。

我打开了诸如 HasRoleTag 之类的 shiro java 标签,实际上没有构造函数采用javax.faces.view.facelets.TagConfig 的实例 作为参数!

你能帮我解决这个问题吗?

谢谢。

【问题讨论】:

    标签: jsf-2 tags shiro


    【解决方案1】:

    从 1.2 版开始,Shiro 不支持 JSF。您正在查看的标记是 JSP 标记。 Deluan Quintão 为 shiro 编写了一组 JSF facelet 标签。你可以在这里阅读他关于使用它们的帖子:http://techbeats.deluan.com/apache-shiro-tags-for-jsffacelets

    请注意,自 1.3 起,他的作品将正式并入 Shiro。 (确实,已经在后备箱里了)

    【讨论】:

    • 我阅读了他的帖子,但他谈到了 JSF 1.x,而我正在使用 JSF 2.x。我还尝试了另一种与 facelets 处理程序相关的异常
    • 我正在使用 JSF2 链接中的库,特别是我使用 HasRole 标记,如果您需要更多帮助,我认为您需要提供有关您所做的会产生该错误的更多详细信息跨度>