2015-09-11 31 views
1

我有一个JavaEE应用(WildFly 8.2应用服务器,JPA 2.1,Hibernate的4.3 ...)如何根据WildFly环境(开发或测试或正式版)

配置JPA,因为我用JSF我使用在JSF project stage(至极值DevelopmentSystemTestProduction根据如果我们在开发或测试或督促服务器)

我们通过JNDI配置中WildFly这JBoss how toWlidFly specific way这样的查找相结合的JSF项目阶段"java:/env/jsf/ProjectStage"返回DevelopmentSystemTestProduction取决于环境

例如,这允许我们配置日志,但不改变源代码(我们使用SLF4J和的logback)和文件的样子:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration debug="true"> 
    <insertFromJNDI env-entry-name="java:/env/jsf/ProjectStage" as="projectStage" /> 
    <property name="STAGE" value="${projectStage}"/> 
    <if condition='property("STAGE").equals("Production")'> 
     <then> 
      <property name="LEVEL" value="INFO"/> 
     </then> 
     <else> 
      <if condition='property("STAGE").equals("SystemTest")'> 
       <then> 
        <property name="LEVEL" value="INFO"/> 
       </then> 
       <else> 
        <property name="LEVEL" value="TRACE"/> 
       </else> 
      </if> 
     </else> 
    </if> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder> 
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
     </encoder> 
    </appender> 

    <logger name="DEBUG" level="TRACE"/> 

    <root level="${LEVEL}"> 
     <appender-ref ref="STDOUT"/> 
    </root> 
</configuration> 

我展示的logback的conf文件,因为我想要做这样的事情与JPA persistence.xml的conf文件

我想配置在persistence.xml

如何在persistence.xml(例如logback.xml)内配置JPA/Hibernate?

如果不可能如何以JavaEE方式以编程方式配置JPA/Hibernate?我们使用JPA做:

@PersistenceContext(unitName = "myappPU", type = PersistenceContextType.EXTENDED) 
private EntityManager value ; 

我想配置EntityManagerFactory其作为Map<String,Object> getProperties()方法,但javadoc中说:“改变地图的内容不会改变配置”这样怎么办?


编辑

谢谢@Nayan Wadekar和@Martijn

没有测试@Nayan Wadekar的解决方案,我认为调用Persistence.createEntityManagerFactory(unitName, map)回报新EntityManagerFactory,但不改变EntityManagerFactory使用通过WildFly,这样就不会影响注入entityManager

@Martijn Burger的解决方案非常具有启发性,我学到了很多关于CDI的知识,但是,如果我很好地理解了溶胶ution,这让我编辑beans.xml CDI的conf文件,而不是persistence.xml JPA的conf文件,我没搞清楚如何使用JNDI配置beans.xml如以没有任何编辑部署我的战争logback.xml ...

但是,这两种反应给了我一些线索:

  • 也许我可以改变编程的EntityManagerFactory WildFly使用via JNDI
  • 也许我可以写一个CDI producer method注入在应用EntityManager

我会试试...

这些反应让我觉得我没有足够的精确性:我的目标是在开发,产品或测试中部署相同的war,甚至不需要编辑任何配置文件(但可能这不是一个好主意......)

+0

不,尝试'Persistence.createEntityManagerFactory(unitName,map)'并在地图中提供必需的属性值。使用'getProperties()'它会返回当前的配置,如果map中的值发生更改,它将不会产生影响。 –

+0

如何在你的'persistence.xml'中创建不同的'persistence-unit',并将它们作为备选注入? –

+0

这个帖子可能会有所帮助:http://antoniogoncalves.org/2014/05/25/switch-datasource-with-cdi-alternatives-and-stereotypes/ –

回答

0

我发现利用项目阶段不太好。首先它紧紧地与JSF紧密联系。由于您使用的是JPA,因此JSF与JPA有什么关系?

不管怎样,事实证明,WildFly这里支持变量

<property name="hibernate.show_sql" value="${some.system.property:false}"/> 
<property name="hibernate.format_sql" value="true"/> 

然后开始你的应用程序时,只需要重写some.system.property

+0

谢谢,但如何在WildFly中添加系统属性?我尝试在'standalone-full.xml'的''元素后面添加一个' '但它似乎没有工作 – kwisatz

+0

好吧,项目阶段:dev,test,prod ...比JSF更通用,JSF之外我使用JNDI访问项目阶段而不使用JSF'FacesContext',所以两个技术不绑定它只是JNDI项目的阶段值和名称是由JSF指定的,这对我来说似乎是可以的。 (即使项目阶段的名称中包含“jsf”,系统也可以在没有JSF的情况下运行) – kwisatz

+0

这就是您的工作方式。你也可以尝试-D。你确定你正在使用standalone-full来启动吗?任何以javax.faces开头的东西都是特定于JSF的。 –

相关问题