- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Eclipse 中,JSF/EL 的自动完成仅适用于遗留 @ManagedBean
或 CDI bean (@Named
),至少在使用 JBoss 工具插件时是这样。
另请参阅:EL proposals / autocomplete / code assist in Facelets with Eclipse或 Eclipse autocomplete (content assist) with facelets (jsf) and xhtml或 Content Assist for JSF2 + CDI (weld) beans + Eclipse Helios
=> 总结:
- 安装 JBoss 工具 JSF + CDI(http://download.jboss.org/jbosstools/oxygen/stable/updates/、JBoss Web 和 Java EE/JBoss 工具 JSF + 可视化页面编辑器 + 上下文和依赖注入(inject)工具);
- 在项目属性中:删除 Project Facets/“JavaServer Faces”,这样非常慢的 Eclipse JSF 自动完成器将不被使用,激活 CDI/CDI 支持。
但是在使用 Spring 时不支持,即 @Controller
或 @Component
。
通常,您现在应该使用完全支持所有 JSF 范围的 CDI bean,但您可能有自己的原因,或者现有项目可能会使用 Spring。
另请参阅:Moving JSF Managed Beans to Spring beans或 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()
和 中扩展isAnnotationPresent()
:
如果没有找到@ManagedBean
,那么还要寻找@Controller
(应该在Spring中使用,所以@Service
等JSF 中不提供)。但这可能很容易调整,请参阅以下来源中的评论。此外,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;
}
我这里提供两个编译类(main+一个内部类)直接下载:
AbstractMemberDefinition.class + AbstractMemberDefinition$1.class
我保证通过上述更改进行值得信赖的编译(即没有任何恶意代码或类似代码,您可以通过反编译检查 CFR , Procyon ,年龄 JAD 或 Eclipse-ECD ) - 您可以直接使用它们或执行自己编译(顺便说一句:堆栈溢出是否提供文件附件?)
安装:
eclipse_home\plugins\org.jboss.tools.jsf_3.8.200.v20170908-0911.jar
org.jboss.tools.jsf_3.8.200.v20170908-0911.jar\org\jboss\tools\jsf\jsf2\bean\model\impl
(例如通过 Total Commander 或其他支持 zip/jar 处理的工具;您甚至可以使用 JDKs jar 工具)。注意:A...$1.class
是一个新文件。 转到 JSF 页面并在 #{
之后键入 Ctrl+Space 以获取 bean 列表。成员自动完成也有效(在 #{beanName.
之后),甚至是递归的。
甚至在 bean 名称上按 Ctrl+click 或 F3 也行!
注意:第一个自动完成调用需要几秒钟来发现初始 bean。
顺便说一句:为此,不需要为项目激活 CDI 支持! (构建速度更快,因为没有 CDI 构建器处于事件状态。)
或者,您可以扩展JBoss 工具CDI 功能来发现Spring bean。它的工作原理相同,此外它们将使用 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)复制到 plugins\org.jboss.tools.cdi.core_1.8.201.v20171221-1913.jar\org\jboss\tools\cdi\internal\核心\实现\定义
必须为项目提供 CDI 支持。
也许为 JBoss 工具项目工作的人可能会将其包含在官方插件中。
最好是提供一个首选项字符串,允许添加任意注释 - 甚至可能是项目特定设置。这将是一个通用的解决方案,没有可能有政治接受问题的“官方 Spring 支持”。
参见 https://issues.jboss.org/browse/JBIDE-25748
关于spring - EL 自动完成/代码协助 Eclipse 和 Spring Beans,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48933757/
有什么区别 和 您能解释一下这两者之间有什么区别吗? 最佳答案 它是一个 XML 命名空间,用于分隔可能存在冲突的元素名称,因此没有真正的区别。 XML Namespaces 关于java -
我刚刚浏览了两个 Web 应用程序,在两个项目的“applicationContext.xml”文件中都有一个标记 ... 另一个是 ... 谁能给我解释一下有什么区别吗? 最佳答案 没有语
我一直在尝试了解 WebSphere Commerce 中的 Java bean,但我真的很困惑。请帮帮我。我需要知道: What is the difference between EntityBe
自从我们更新到 grails 2.0.1(从 2.0.0 开始)以来,通过 bean 字段显示的所有 bean 都错误地显示为“withBean”字段的第一个属性。在我下面发布的示例中,所有 [fir
我有一个 bean,我将另一个 beanlist 放入其中,并且我想访问该内部 bean。 我的第一个 Bean 是: public class FirstDTO { private String F
我正在尝试将 CSS 和 JS 添加到 spring MVC 项目中的 JSP 页面,以便我在 dispatcher-servlet.xml 中包含了 js/css 文件夹的引用,如下所示:
当我将请求传递给 RestController 时,出现以下错误。 org.springframework.beans.factory.xml.XmlBeanDefinitionStoreExcept
我看到很多示例将 bean 标记为实体 bean (@Entity) 和命名 bean (CDI),以避免创建 2 个类(托管 bean 和实体 bean)并利用 Bean 验证以便可以执行验证在客户
在我的理解中, session 总是意味着有状态。考虑 servlet session 对象, 想想 cookie。如果 session 是无状态的,我认为我们根本不需要 session 。 在jee
我完全是Spring框架的初学者。我当时正在玩一个创建对象实例的示例。因此需要您的帮助! 看看这个例子: MainApp.java: import org.springframework.contex
这个问题在这里已经有了答案: What is a JavaBean exactly? (23 个回答) 关闭 7 年前。 我已经阅读了有关 EJB、Java Beans 的内容,但是我仍然对“bea
我刚开始使用 Spring-Framework,实际上我正在使用 spring-boot 库。我有以下问题: 我知道在 @Configuration 类中使用 @Bean 注册的 bean 默认是单例
我对下面提到的场景中使用Spring Framework时会创建的实例数量有疑问: bean配置是这样的 or 默认情况下,bean "a"有 singleton scope .所以
在我的 Spring-Module.xml 中,我有两个 bean: ... ... 我像这样实例化我的类: Applicat
@Autowired private Map departments; 我的 spring 配置文件 只要使用 @Autowired 需要日期,它就可以正常工作 同样, 如何使用没有属性
我已经为 ComboBox 设置了 ContainerDataSource this.comboBox.setContainerDataSource(container)。这个容器是一个 BeanIt
为了支持流畅的编程风格,我最近修改了我们的 Java Beans setter 方法以返回 Bean 类。但是现在 Java Beans Activation Framework (rel 1.1)
有人可以告诉我在我的 ApplicationContext 中我必须使用 beans:bean 而不是 bean 的什么以及如何修复它。
我有如下配置: batch:job id="reconciliationJob" job-repository="jobRepository" restartable="true" 在应用程序上下文启
我已经为 Test_flow 创建了简单的测试套件,但是当我尝试运行该流程时出现错误。 java.lang.RuntimeException: org.mule.api.config.Configur
我是一名优秀的程序员,十分优秀!