小编Chr*_*kov的帖子

UIForm与prependId ="false"中断<f:ajax render>

我对这个事实背后的想法有一个疑问,即只有UIForm属性prependId.为什么NamingContainer界面中没有指定属性?你现在可能会说这是因为后向兼容性但我宁愿打破兼容性并让实现该接口的用户也实现prependId的方法.

从我对UIForm组件中的prependId的观点来看,主要的问题是它会破坏findComponent() 我希望如果我使用prependId,那么NamingContainer行为会改变,不仅与渲染有关,而且在想要在组件树中搜索组件时也是如此.

这是一个简单的例子:

<h:form id="test" prependId="false">
  <h:panelGroup id="group"/>
</h:form>
Run Code Online (Sandbox Code Playgroud)

现在,当我想获得panelGroup组件时,我希望将字符串传递"group"给方法findComponent(),但它不会找到任何东西,我必须使用"test:group".

具体问题是,当使用ajax时prependId="false".ajax标记在属性更新和处理中期望值关注命名容器.有点奇怪的是,当我使用它时prependId="false",我必须指定完整的id或路径,但没关系.

<h:form id="test" prependId="false">
  <h:panelGroup id="group"/>
</h:form>
<h:form id="test1" prependId="false">
  <h:commandButton value="go">
    <f:ajax render="test:group"/>
  </h:commandButton>
</h:form>
Run Code Online (Sandbox Code Playgroud)

那么这段代码将呈现没有问题,但它不会更新panelGroup,因为它无法找到它.在PartialViewContext将只包含ID "group"为renderIds的元素.我不知道这是否是预期的,可能是但我不知道代码.现在我们到了方法findComponent()无法找到组件的位置,因为作为参数传递的表达式是"group"方法期望"test:group"找到组件的位置.

一种解决方案是编写自己的解决方案,findComponent()这是我选择处理此问题的方式.在这个方法中,我处理一个组件,它是一个NamingContainer并且具有属性prependId像正常一样设置为false UIComponent.我将不得不为每个UIComponent提供prependId属性的事情做到这一点,这很糟糕.反射将有助于绕过类型的静态定义,但它仍然不是一个非常干净的解决方案.

另一种方法是在NamingContainer接口中引入prependId属性,并改变行为,findComponent()如上所述.

最后提出的解决方案是改变ajax标记的行为以传递整个id,但这只能解决ajax问题而不是findComponent()实现背后的程序问题.

你怎么看待这个以及它为什么会这样实现呢?我不能成为第一个遇到这个问题的人,但是我找不到相关的主题?!

forms ajax jsf naming-containers

20
推荐指数
1
解决办法
8446
查看次数

字节码将记录类转换为可变的

我刚刚看到 EBean 以一种让我感觉奇怪的方式对记录类文件进行字节码转换,我寻求从 JVM 角度来看这是否合法的答案。

显然,可以有一个类文件,其中类扩展java.lang.Record并定义记录组件属性(因此它是一个“记录”,就像 javac 会创建它一样),但具有 javac 不允许的以下附加“功能”:

  • 使记录组件的字段成为非最终字段
  • 添加未通过规范构造函数设置、也未通过记录组件属性公开的其他字段

对我来说,这似乎是非法的,我预计会出现 JVM 验证错误。我想知道这是否是“受支持”的东西,我可以在此基础上进行构建,或者缺乏验证是否是 JVM 错误。难道记录只是Java语言的一个特性,没有JVM的支持吗?!我读到记录的最终字段是“真正的最终”,即使通过反射也无法更改,并且假设必须有特殊的 JVM 支持来确保记录与 Java 语言语义相匹配......

java jvm bytecode jvm-bytecode java-record

9
推荐指数
2
解决办法
1028
查看次数

如何使用OSGi和EE6模块化企业应用程序?

我知道已经有一些与此主题相关的问题,但我还没有找到真正的解决方案.

目前我正在使用JPA,CDI,JSF开发EE6应用程序.我想采用更模块化的方法,而不是将所有内容打包到WAR或EAR中,并将整个内容部署到Application Server上.

我试图通过将模块分成3个maven项目来尽可能地将我的应用程序设计为模块化:

  • API - 包含(无状态)服务的接口
  • 模型 - 包含特定模块的JPA实体
  • Impl - 包含API的实现,主要是CDI bean

目前,每个模块的视图逻辑都是在一个大型Web项目中进行的,这很丑陋.我已经想到了网络碎片,但如果我将我的bean类和xhtml文件传播到jar文件中,我将不得不实现一个钩子,以便父Web应用程序可以查找资源.这种解决方案至少使我能够为每个模块提供第四个项目,该项目将包含与模块相关的所有视图逻辑,这是一个良好的开端.

我想要的不仅仅是我可以拥有这4种项目,而且每个项目都是热插拔的.这让我想到了OSGi,在我意识到EEG技术在OSGi容器中得不到很好支持之前,它起初非常酷.

JPA

我们先来看看JPA.有一些教程[1]解释了如何制作一个支持JPA的OSGi Bundle,但这些教程都没有展示如何将实体分散到不同的bundle(模块的模型项目).我想要三个不同的模块

  • 核心
  • 用户
  • 博客

博客模块的模型项目对用户的模型项目具有(编译时)依赖性.用户模块的模型项目对核心的模型项目具有(编译时)依赖性.

如何在不必为模块的每个模型项目创建持久性单元的情况下使JPA在这种情况下工作?我想要一个持久性单元,它知道运行时可用的所有实体.实体所在的模型项目当然应该是可热插拔的.也许我需要为每个导入所有项目所需实体的客户端创建一个单独的项目,并包含一个包含所有必要配置项的persistence.xml.是否有任何可用的maven插件用于构建此类项目甚至其他方法来解决该问题?

CDI

CDI非常好.我真的很喜欢它,我不想再错过了!我使用像MyFaces CODI和DeltaSpike这样的CDI扩展,真棒!我将我的(无状态)服务注入其他服务或注入视图层,这非常棒.由于我的服务是无状态的,因此将它们用作OSGi服务应该不是问题,但OSGi中的CDI集成又如何呢?我发现了一个玻璃鱼CDI扩展[2],可以将OSGi服务注入CDI bean,但我也希望OSGi服务能够成为CDI bean.我不完全确定如何实现这一点,可能我必须使用BeanManager来实例化实现,然后在BundleActivator中的ServiceRegistry中注册其接口的每个实现.有没有标准的方法呢?我想避免任何(编译时)依赖于OSGi框架.

我也想使用我的服务,就像我现在使用它们一样,没有改变任何东西(实现没有注释,注入点不合格).有一个JBoss Weld扩展/子项目[3]似乎针对该问题,但它似乎是不活跃的,我找不到任何最佳实践或如何.如何保留我的实现,但仍然可以使用OSGi?我的意思是,在实现中添加注释并不是什么大问题,因为每个实现都已经使用构造型注释进行了注释,无论如何我想要阻止它.

JSF

如前所述,我希望能够明智地传播我的视图逻辑模块.据我所知,这不是开箱即用的.Pax Web [4]应该以某种方式解决,但我不熟悉它.

我想在包含Facelet模板的模块"core"中有一个项目"CoreWeb",我们称之为"template.xhtml".然后,模块"blog"中名为"BlogWeb"的项目中的JSF页面应该能够引用该模板并应用合成.

为了能够扩展视图,我将介绍一个java接口"Extension",它可以由特定的模块类实现.然后,视图的控制器将注入扩展的所有实现.例如,扩展名将提供将包含在主视图中的子视图列表.

所描述的扩展机制可以很容易地实现,但必须满足以下要求:

  • 将新的OSGi Bundle添加到应用程序服务器时,可用扩展的集合可能会更改,扩展必须可用于视图的控制器.
  • 应该可以访问应包含在主视图中的子视图(来自单独的包).

Spring Slices [5]的单个主机但多个切片应用程序的概念非常有趣,但似乎仅限于Spring DM Server,该项目似乎也处于非活动状态.

摘要

在我描述的所有示例和行为之后,我希望您知道我想要实现的目标.它只是一个非常动态和模块化的EE6应用程序.

我在最后寻找的是至少有关如何让所有内容运行的文档,正如我所期望的那样,甚至更好的已经可行的解决方案!

[1] http://jaxenter.com/tutorial-using-jpa-in-an-osgi-environment-36661.html

[2] https://blogs.oracle.com/sivakumart/entry/typesafe_injection_of_dynamic_osgi

[3] http://www.slideshare.net/TrevorReznik/weldosgi-injecting-easiness-in-osgi

[4] http://team.ops4j.org/wiki//display/paxweb/Pax+Web

[5] https://jira.springsource.org/browse/SLICE

jsf osgi jpa cdi java-ee-6

6
推荐指数
1
解决办法
1153
查看次数

Hibernate的国际化

我希望从hbm2ddl生成这样的东西:

______________    ______________       _______________
|Language    |    |I18N        |       |Test         |
--------------    --------------       ---------------
|iso3_code:PK|----|iso3_code:PK|       |test_id:PK   |
--------------    |i18n_id:PK  |-------|desc_i18n_id |
                  |i18n_text   |     |-|labl_i18n_id |
                  --------------       ---------------
Run Code Online (Sandbox Code Playgroud)

这或多或少意味着,有一种表语言,它包含iso代码和其他一些信息.i18n表在语言表上有一个外键iso3_code,它也是一个主键.PK的另一部分是i18n_id.然后测试表在字段i18n_id上的表i18n上有两个外键.

解析后的hbm2ddl的输出应该是这样的:

public class Test  implements java.io.Serializable {
    private Integer testId;
    private Map<String,String> label = new HashMap<String,String>(0);
    private Map<String,String> description = new HashMap<String,String>(0);

    public Test() {
    }

    public Integer getTestId() {
        return this.testId;
    }

    public void setTestId(Integer testId) {
        this.testId = testId;
    }

    public Map<String, String> getLabel() {
        return label;
    }

    public void setLabel(Map<String,String> …
Run Code Online (Sandbox Code Playgroud)

hibernate internationalization

5
推荐指数
1
解决办法
4957
查看次数

Glassfish 3.1.1重新部署时出错

重新部署不能正常工作,还是只是配置错误?我尝试重新部署应用程序时收到以下错误:

INFO: Unsanitized stacktrace from failed start...
com.sun.faces.config.ConfigurationException: java.util.concurrent.ExecutionException: com.sun.faces.config.ConfigurationException: Unable to parse document 'bundle://181.0:1/com/sun/faces/jsf-ri-runtime.xml': DTD factory class org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl does not extend from DTDDVFactory.
    at com.sun.faces.config.ConfigManager.getConfigDocuments(ConfigManager.java:675)
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:322)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:225)
    at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:4750)
    at com.sun.enterprise.web.WebModule.contextListenerStart(WebModule.java:531)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:5366)
    at com.sun.enterprise.web.WebModule.start(WebModule.java:497)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:917)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:901)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:733)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1990)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1641)
    at com.sun.enterprise.web.WebApplication.start(WebApplication.java:101)
    at org.glassfish.internal.data.EngineRef.start(EngineRef.java:130)
    at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:269)
    at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:294)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:462)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
    at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:380)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:355)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1064)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:96)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1244)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1232)
    at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:455)
    at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:212)
    at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:168) …
Run Code Online (Sandbox Code Playgroud)

java jsf glassfish

5
推荐指数
1
解决办法
4716
查看次数

在 lambda 表达式中使用默认方法

根据JLS 15.27.2,lambda 主体与周围上下文具有相同的范围,我想知道是否有特定原因来说明为什么 lambda 实现的接口中的默认方法在主体中也不可用? 此限制是否启用了一些优化,还是只是为了保持重载规则简单?

我今天正在对一些 Java 8 API 进行原型设计,当我遇到这个限制时,我感到非常失望,因为使用默认方法可以让我以一种非常优雅和非侵入性的方式实现该 API。

通过要求静态导入或多或少可以实现相同的优雅,但这会导致“污染”命名空间。

有没有可能取消这个限制?

java lambda java-8 default-method

4
推荐指数
1
解决办法
786
查看次数

Hibernate代理继承问题

我正在使用每个具体类的继承策略表,今天我遇到了一些非常奇怪的事情.我仍然不知道这个问题的原因,但让我解释它是什么...

我有以下课程:

@Entity
@Table(name="...")
@Inheritance(strategy=InheritanceType.JOINED)
public class A implements Serializable{...}

@Entity
@Table(name="...")
@PrimaryKeyJoinColumn(name="...")
public class B extends A{...}
Run Code Online (Sandbox Code Playgroud)

看起来很简单,我用来检索条目的查询基本上是这样的:

FROM A
Run Code Online (Sandbox Code Playgroud)

这也返回B的实例,这是我所期望的.这些条目被加载到视图的支持bean中(Bean是视图编组的,持久化上下文已经结束).视图通过EL访问bean以检索dataTable的条目:

<h:dataTable value="#{bean.entries}" var="entry">...</h:dataTable>
Run Code Online (Sandbox Code Playgroud)

在dataTable中,我有一个这样的commandLink:

<h:commandLink value="click" actionListener="#{bean.doSomething}">
    <f:setPropertyActionListener value="#{entry}" target="#{bean.selected}" />
</h:commandLink>
Run Code Online (Sandbox Code Playgroud)

bean使用类型A的对象,但是如果所选条目的类型是子类,则在调用actionListener-Expression时调用的CDI-Decorator会执行其他操作:

public void doSomething(ActionEvent event){
    if(delegate.getSelected() instanceof B){
        // special
    }else{
        delegate.doSomething(event);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在它变得复杂了.if是"有时"输入但不是在预期时输入.调试显示返回的Object delegate.getSelected()是类型的A_javassisst,当它应该是B的实例时.最好的事情是,toString()方法返回B @ 123让我相信第一个地方,即对象属于B型,但不是......

现在我们来问我的问题......到底发生了什么?我已经考虑过在保存dataTable的状态时可能会出现的一些序列化问题,但我不确定(数据表是否应该检索value-expression返回的值并使用这些值进行遍历或者可能会中断国家?).

dataTable是一个PrimeFaces数据表,没有尝试过JSF数据表,但它不能成为primefaces的错...

所有这些都在以下环境中:

  • WAS 8.0.0.1(=> OpenWebBeans)
  • CODI 1.1.1
  • MyFaces 2.1.1
  • Hibernate 3.6.5

在此先感谢您的帮助!

编辑:

我的所有对象都是B类,意味着db在表"b"中包含表"a"中每个条目的条目,但有时我从JPA/Hibernate返回的对象不是B的实例!我需要帮助,我不知道为什么会发生这种情况!?!

编辑:

我的诊断错了,返回的类型是正确的!我真的有一个类型B的代理,而不是类型A的代理.我的问题是在setter之前调用了装饰的方法.这比Hibernate更多的JSF相关!

我没有遇到你报告的问题和陷阱,使用instanceof对我来说很好!

hibernate jpa cdi

3
推荐指数
1
解决办法
3900
查看次数

可能UIComponent#getFamily()是否返回null?

我想知道这个方法UIComponent#getFamily()可能会返回null吗?Mojarra 2.1.3在返回时会抛出异常,null但MyFaces 2.1.3不会.

组件真的需要一个家庭吗?

jsf specifications jsf-2

3
推荐指数
1
解决办法
617
查看次数