Eclipse 和 Spring Beans 的 EL 自动完成/代码辅助

2023-12-11

在 Eclipse 中,JSF / EL 的自动完成功能仅适用于旧版@ManagedBean或 CDI 豆(@Named),至少在使用 JBoss 工具插件时是这样。
也可以看看:使用 Eclipse 的 Facelets 中的 EL 建议/自动完成/代码辅助   or   带有 Facelets (jsf) 和 xhtml 的 Eclipse 自动完成(内容辅助)   or   JSF2 + CDI(焊接)bean + Eclipse Helios 的内容辅助
=> 总结:
- 安装 JBoss 工具 JSF + CDI (http://download.jboss.org/jbosstools/oxygen/stable/updates/、JBoss Web 和 Java EE /JBoss 工具 JSF + 可视化页面编辑器 + 上下文和依赖注入工具);
- 在项目属性中:删除 Project Facets/"JavaServer Faces",这样 Eclipse JSF 自动完成器就会变得非常慢not要使用,请激活 CDI / CDI 支持。

但使用Spring时不支持,即@Controller or @Component.
通常,您现在应该使用完全支持所有 JSF 范围的 CDI bean,但您可能有自己的理由,或者现有项目可能会使用 Spring。
也可以看看:将 JSF 托管 Bean 迁移到 Spring beans   or   https://www.beyondjava.net/blog/integrate-jsf-2-spring-3-nicely/

那么,Spring web bean 如何支持 JSF/EL 自动完成呢?


我深入研究了 JBoss 工具的实现,一个小小的改变让 Spring 用户感到高兴。
:-)
有一个基于 JSF 工具的解决方案(首先)和一个基于 CDI 工具的替代方案(之后)。

以下是基于jbosstools-4.5.2.Final使用插件文件org.jboss.tools.jsf_3.8.200.v20170908-0911.jar
但其他版本的更改应该相同或非常相似(相关源文件的最后更改是在 2011 年 12 月或 2012 年 9 月)。

班上org.jboss.tools.jsf.jsf2.bean.model.impl.AbstractMemberDefinition必须在方法中扩展getManagedBeanAnnotation() and isAnnotationPresent():

If @ManagedBean没找到,那就再找@Controller(应该在Spring中使用,所以@ServiceJSF 中不提供等)。但这可以很容易地调整,请参阅以下来源中的评论。此外,Spring 使用value注释属性而不是name- 这是通过包装类解决的。

public boolean isAnnotationPresent(String annotationTypeName) {
    //TW: added Spring annotations
    boolean b = (getAnnotation(annotationTypeName) != null);
    if (!b  &&  JSF2Constants.MANAGED_BEAN_ANNOTATION_TYPE_NAME.equals(annotationTypeName)) {
        b = (getAnnotation("org.springframework.stereotype.Controller") != null);
        /* with support for all Spring annotations:
        b = (getAnnotation("org.springframework.stereotype.Controller") != null
                ||  getAnnotation("org.springframework.stereotype.Service") != null
                ||  getAnnotation("org.springframework.stereotype.Repository") != null
                ||  getAnnotation("org.springframework.stereotype.Component") != null);
        */
    }
    return b;
}


public AnnotationDeclaration getManagedBeanAnnotation() {
    AnnotationDeclaration ad = annotationsByType.get(JSF2Constants.MANAGED_BEAN_ANNOTATION_TYPE_NAME);
    //TW: added Spring annotations
    if (ad != null)  return ad;
    ad = annotationsByType.get("org.springframework.stereotype.Controller");
    /* with support for all Spring annotations:
    if (ad == null)  ad = annotationsByType.get("org.springframework.stereotype.Service");
    if (ad == null)  ad = annotationsByType.get("org.springframework.stereotype.Repository");
    if (ad == null)  ad = annotationsByType.get("org.springframework.stereotype.Component");
    */
    if (ad != null) {
        // create wrapper to map "value" (used by Spring) to "name" (which is used by @ManageBean)
        ad = new AnnotationDeclaration() {
                private AnnotationDeclaration wrapped;

                AnnotationDeclaration init(AnnotationDeclaration wrappedAD) {
                    this.wrapped = wrappedAD;
                    return this;
                }

                @Override
                public Object getMemberValue(String name) {
                    Object val = wrapped.getMemberValue(name);
                    if (val == null  &&  "name".equals(name)) {
                        val = wrapped.getMemberValue(null);
                    }
                    return val;
                }

                @Override
                public Object getMemberValue(String name, boolean resolve) {
                    Object result = null;
                    if (resolve) {
                        result = this.getMemberConstantValue(name);
                    }
                    if (result == null) {
                        result = this.getMemberValue(name);
                    }
                    return result;
                }

                @Override
                public void setDeclaration(IJavaAnnotation annotation) {
                    wrapped.setDeclaration(annotation);
                }

                @Override
                public IJavaAnnotation getDeclaration() {
                    return wrapped.getDeclaration();
                }

                @Override
                public IResource getResource() {
                    return wrapped.getResource();
                }

                @Override
                public IMemberValuePair[] getMemberValuePairs() {
                    return wrapped.getMemberValuePairs();
                }

                @Override
                public Object getMemberConstantValue(String name) {
                    return wrapped.getMemberConstantValue(name);
                }

                @Override
                public Object getMemberDefaultValue(String name) {
                    return wrapped.getMemberDefaultValue(name);
                }

                @Override
                public IMember getParentMember() {
                    return wrapped.getParentMember();
                }

                @Override
                public String getTypeName() {
                    return wrapped.getTypeName();
                }

                @Override
                public IType getType() {
                    return wrapped.getType();
                }

                @Override
                public int getLength() {
                    return wrapped.getLength();
                }

                @Override
                public int getStartPosition() {
                    return wrapped.getStartPosition();
                }

                @Override
                public IAnnotationType getAnnotation() {
                    return wrapped.getAnnotation();
                }

                @Override
                public IAnnotation getJavaAnnotation() {
                    return wrapped.getJavaAnnotation();
                }

                @Override
                public IMember getSourceMember() {
                    return wrapped.getSourceMember();
                }

                @Override
                public IJavaElement getSourceElement() {
                    return wrapped.getSourceElement();
                }
            }.init(ad); // class
    }
    return ad;
}

我在这里提供了两个编译好的类(主类+一个内部类)供直接下载:
AbstractMemberDefinition.class + AbstractMemberDefinition$1.class
我保证通过上述更改进行值得信赖的编译(即没有任何恶意代码或类似代码,您可以通过反编译进行检查CFR, Procyon, aged JAD or Eclipse-ECD) - 您可以直接使用它们或自己执行编译(顺便说一句:堆栈溢出是否提供文件附件?)

安装:

  • 退出 Eclipse。
  • 制作原始文件的备份副本
    eclipse_home\plugins\org.jboss.tools.jsf_3.8.200.v20170908-0911.jar
    (例如 *.jar_orig)。
  • 将提供的类复制到org.jboss.tools.jsf_3.8.200.v20170908-0911.jar\org\jboss\tools\jsf\jsf2\bean\model\impl(例如,通过 Total Commander 或其他支持 zip/jar 处理的工具;您甚至可以使用 JDK 的 jar 工具)。注:A...$1.class是一个新文件。
  • 再次启动 Eclipse 并享受吧!

转到 JSF 页面并在后面键入 Ctrl+Space#{获取 Bean 列表。会员自动完成功能也有效(之后#{beanName.),甚至递归。
即使在 Bean 名称上按 Ctrl+单击或 F3 也可以!
注意:第一次自动完成调用需要几秒钟来进行初始 bean 发现。

顺便说一句:为此,有no需要激活项目的CDI支持! (构建速度更快,因为没有 CDI Builder 处于活动状态。)


或者,您可以延长JBoss 工具 CDI发现 Spring beans 的功能。它的工作原理相同,此外它们将通过 Ctrl+Alt+Z(工具栏按钮打开 CDI 命名 Bean).
注意:我没有检查如果非 CDI Spring bean 被发现为 CDI bean 是否有任何副作用!

为此,文件org.jboss.tools.cdi.internal.core.impl.definition.AbstractMemberDefinition必须在方法中扩展getNamedAnnotation():

public AnnotationDeclaration getNamedAnnotation() {
    AnnotationDeclaration ad = getAnnotation(CDIConstants.NAMED_QUALIFIER_TYPE_NAME);
    //TW: added Spring annotations
    if (ad != null)  return ad;
    ad = getAnnotation("org.springframework.stereotype.Controller");
    /* add additional Spring annotations, if desired:
    if (ad != null)  return ad;
    ad = getAnnotation("org.springframework.stereotype.Service");
    if (ad != null)  return ad;
    ad = getAnnotation("org.springframework.stereotype.Repository");
    if (ad != null)  return ad;
    ad = getAnnotation("org.springframework.stereotype.Component");
    */
    return ad;
}

您必须复制编译的类(下载:CDI-AbstractMemberDefinition.class) into plugins\org.jboss.tools.cdi.core_1.8.201.v20171221-1913.jar\org\jboss\tools\cdi\internal\core\impl\definition

CDI 支持必须对该项目有效。


也许为 JBoss 工具项目工作的人可能会将此包含在官方插件中.
最好是提供一个首选项字符串,它允许添加任意注释 - 甚至可能是项目特定的设置。这将是一个通用的解决方案,并且没有可能存在政治接受问题的“官方 Spring 支持”。
See https://issues.jboss.org/browse/JBIDE-25748

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Eclipse 和 Spring Beans 的 EL 自动完成/代码辅助 的相关文章

  • Primefaces 中动态生成条形图

    我正在使用 Primefaces 4 0 我需要根据查询结果的数量生成条形图 条形图的标题和颜色也应该能够为所有使用查询结果的人动态设置 条形图示例如下
  • Spring Security 中 Web 忽略和 Http 允许之间的区别?

    这两种方法有什么区别 Override protected void configure HttpSecurity http throws Exception http authorizeRequests antMatchers api p
  • Eclipse 包资源管理器缩放?

    我发现将 Eclipse 配置为完全符合您的要求是一项艰巨的工作 因此我不打算自己尝试这样做 我想 缩小 包浏览器侧边栏 你看 我喜欢只在屏幕上显示我的代码 并为项目中的文件显示一小部分 但是 由于这个原因 我永远无法看到当前所在的文件或包
  • Spring:如何在主bean创建后初始化相关的惰性bean

    我有带有延迟初始化 bean 的代码 Component Lazy class Resource Component Lazy CustomProcessor class ResourceProcessorFoo Autowired pub
  • Spring Security从数据库获取用户ID

    我正在使用 spring security 进行身份验证并成功获得User目的 org springframework security core userdetails User 任何我需要的地方 但我想要UserId还有 春天里没有的U
  • @OneToMany 与 @JoinTable 错误

    我试图理解 OneToMany with JoinTable 对于这样的场景 我正在使用 JPA 2 1 Hibernate 5 0 4 和 Oracle 11 XE 当我打电话时userDao save user 下面的代码 我有 jav
  • Java Spring 应用程序存在内存泄漏。系统非堆内存不断增加

    我已使用 yourkit 分析器监视我的 Web 应用程序 保留最大大小的主要对象是 SessionFactoryImpl webappclassloader 和 CGlib 对象显示 spring crone调度程序会导致内存泄漏吗 我尝
  • 如何在 Eclipse 中以编程方式关闭编辑器 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 当我们删除一个项目 IProject 时 我们想关闭它的所有打开的文件 我可以通过项目的成员方法访问 IFiles 我想关闭已删除项目的所有
  • 如何使用 Spring Boot 和 Flyway 设置 Quartz 调度程序的数据库架构?

    我有一个 Spring Boot 应用程序 它使用 Quartz 调度程序和 PostGreSQL 数据库作为存储 我正在将它从使用它自己的数据库运行迁移到publicschema 来针对每个应用程序使用一个 schema 的共享数据库运行
  • NetBeans 代码模板 ${date}?

    我在 Eclipse 中有这个代码模板 自 日期 起 当输入时我得到这样的东西 自2009年8月4日起 但是当我添加相同的模板时 自 日期 起 到 NetBeans 它输出 自日期以来 有人可以帮忙吗 还没有答案吗 这在 Netbeans
  • 在 php 中为类自动生成 getter 和 setter 的最佳方法是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我经常创建一个包含一些私有变量的类 当设置此类的实例时 应该可以使用 getter 和 setter 填充该类的所有变量 有没有一种简单的方法可
  • 是否可以@Lazy 初始化Spring @Value?

    是否有可能 Lazy初始化一个Spring Value e g Lazy Value someConfig private String someConfig 我特别提到的场景是通过 JNDI 设置的变量 并且一个嵌入式 Tomcat 容器
  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 非 Spring 托管类中 DI 的编译时编织

    我想为标记为的类配置编译时编织 Configurable注释能够将 spring 依赖项注入到初始化的类中new操作员 我不想使用加载时编织 因为我无权访问应用程序服务器的运行脚本 因此无法修改它 另外 我希望能够在测试中使用此类 我的意思
  • 打印 OSGI 包类路径?

    在普通的 java 应用程序中 可以使用以下命令打印类路径的内容 String ss System getProperty java class path System out println ss 但是如何打印使用 eclipse PDE
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java

随机推荐