我正在尝试使用MyFaces v 2.1与WebSphere Application Server Community Edition v3.0.0.1和Eclipse Juno创建一个简单的JSF Web应用程序,但是当我尝试运行该应用程序时,返回以下错误
java.lang.ClassNotFoundException: com.sun.faces.config.ConfigureListener
org.apache.geronimo.common.DeploymentException: java.lang.ClassNotFoundException: com.sun.faces.config.ConfigureListener
at org.apache.geronimo.web25.deployment.AbstractWebModuleBuilder.createWebAppClassFinder(AbstractWebModuleBuilder.java:665)
at org.apache.geronimo.web25.deployment.AbstractWebModuleBuilder.configureBasicWebModuleAttributes(AbstractWebModuleBuilder.java:698)
at org.apache.geronimo.tomcat.deployment.TomcatModuleBuilder.addGBeans(TomcatModuleBuilder.java:469)
at org.apache.geronimo.j2ee.deployment.SwitchingModuleBuilder.addGBeans(SwitchingModuleBuilder.java:174)
at org.apache.geronimo.j2ee.deployment.EARConfigBuilder.buildConfiguration(EARConfigBuilder.java:764)
at org.apache.geronimo.deployment.Deployer.deploy(Deployer.java:255)
at org.apache.geronimo.deployment.Deployer.deploy(Deployer.java:140)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at org.apache.geronimo.gbean.runtime.ReflectionMethodInvoker.invoke(ReflectionMethodInvoker.java:34)
at org.apache.geronimo.gbean.runtime.GBeanOperation.invoke(GBeanOperation.java:131)
at org.apache.geronimo.gbean.runtime.GBeanInstance.invoke(GBeanInstance.java:883)
at org.apache.geronimo.kernel.basic.BasicKernel.invoke(BasicKernel.java:245)
at org.apache.geronimo.kernel.KernelGBean.invoke(KernelGBean.java:344)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at org.apache.geronimo.gbean.runtime.ReflectionMethodInvoker.invoke(ReflectionMethodInvoker.java:34)
at org.apache.geronimo.gbean.runtime.GBeanOperation.invoke(GBeanOperation.java:131)
at org.apache.geronimo.gbean.runtime.GBeanInstance.invoke(GBeanInstance.java:883)
at org.apache.geronimo.kernel.basic.BasicKernel.invoke(BasicKernel.java:245)
at org.apache.geronimo.system.jmx.MBeanGBeanBridge.invoke(MBeanGBeanBridge.java:172)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:848)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:773)
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1438)
at javax.management.remote.rmi.RMIConnectionImpl.access$200(RMIConnectionImpl.java:83)
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1276)
at java.security.AccessController.doPrivileged(AccessController.java:284)
at …
Run Code Online (Sandbox Code Playgroud) 我正在开发Java EE 7应用程序,并且要求将应用程序部署到运行GlassFish 4.0或WildFly 8.1.0的应用程序服务器上.我得到的问题是GlassFish和WildFly使用略有不同的JNDI名称格式,但我看不出如何使我的应用程序兼容两者.
在GlassFish中,我的persistence.xml文件引用数据源jdbc/myDataSouce,但在WildFly中,数据源需要是java:/ jdbc/myDataSource.
对于使用@Resource注释的类也是如此.在GlassFish中,使用JavaMail的类的注释将是@Resource(name ="mail/myMailSession"),但要部署到WildFly,这需要是@Resource(name ="java:mail/myMailSession").
我知道我可以解压缩EAR和JAR文件以手动编辑文件,例如persistence.xml,但我不能对已经使用@Resource注释的类执行此操作.
有没有办法可以将我的编译应用程序部署到GlassFish和WildFly上,而无需维护两个不同版本的代码?我假设答案可能在于特定于应用程序的部署描述符,但我找不到任何涵盖这两种情况的示例.
有人能指出我正确的方向吗?
我正在开发一个Jenkins插件,它使用Codehaus Cargo Java API管理EAR文件到Java EE容器的部署,但是在使用API部署到远程Wildfly容器时我遇到了一个问题.在部署到其他容器(如Glassfish)时,代码工作正常,但在尝试将EAR文件部署到Wildfly容器时,将XNIO001001: No XNIO provider found
返回错误消息.
我花了几个小时研究这个问题,但我找不到任何可能解决问题的方法.尝试部署到在Windows和Ubuntu上运行的Wildfly 8.1和8.2时会发生此问题.我还检查了Wildfly服务器日志,但它不包含与此问题相关的任何内容.
我的问题是,XNIO001001: No XNIO provider found
当代码是Jenkins插件的一部分时,我可以做什么来防止部署到Wildfly容器时出现错误?
我知道Jenkins已经有了类似的插件,并且Cargo可以与Maven一起使用来部署到容器,但这两个选项都不符合我的特定要求.
我编写的用于部署EAR文件的代码如下:
public void redeploy(String containerId, String deployFile, String hostname, String username, String password) {
DeployableFactory deployableFactory = new DefaultDeployableFactory();
Deployable deployable = deployableFactory.createDeployable(containerId, deployFile, DeployableType.EAR);
ConfigurationFactory configurationFactory = new DefaultConfigurationFactory();
Configuration configuration = configurationFactory.createConfiguration(containerId, ContainerType.REMOTE, ConfigurationType.RUNTIME);
configuration.setProperty("cargo.hostname",hostname);
configuration.setProperty("cargo.remote.username", username);
configuration.setProperty("cargo.remote.password", password);
ContainerFactory containerFactory=new DefaultContainerFactory();
Container container = containerFactory.createContainer(containerId, ContainerType.REMOTE, configuration);
DeployerFactory deployerFactory = new DefaultDeployerFactory();
Deployer deployer = …
Run Code Online (Sandbox Code Playgroud) 我正在使用Apache Commons Collections创建一个MultiKeyMap,它将存储两个具有一个相应值的键,然后使用MapIterator遍历地图.我遇到的问题是我需要将MapIterator返回的密钥分解回单个密钥而不是单个"复合".虽然我可以分割包含"复合"键的字符串或使用反射,但这些选项似乎都不是很优雅.
为了模拟问题,我创建了以下示例代码
MultiKeyMap multiKeyMap = new MultiKeyMap();
multiKeyMap.put("Key 1A","Key 1B","Value 1");
multiKeyMap.put("Key 2A","Key 2B","Value 2");
multiKeyMap.put("Key 3A","Key 3B","Value 3");
MapIterator it = multiKeyMap.mapIterator();
while (it.hasNext()) {
it.next();
System.out.println(it.getKey());
System.out.println(it.getValue());
}
Run Code Online (Sandbox Code Playgroud)
it.getKey()
返回多键[键3A,3B键],但我想要做的就是分配键单个变量,像myKey1 = it.getKey().keys[0]
和myKey2 = it.getKey().keys[1]
,但是我无法找到在JavaDoc任何实现这一目标.
是否可以将MapIterator返回的键分解为各个键而不使用反射或操纵it.getKey()返回的字符串?
我对 DDD 的概念相对较新,并且发现有很多示例解释了如何为相对简单的场景定义有界上下文,但似乎没有涵盖的一个领域是主数据和参考数据。
我指的参考数据类型包括货币代码、国家/地区代码和计量单位,它们将用于确保仅使用有效值。
我所指的主数据类型是诸如客户和产品之类的实体,其中不需要不同的有界上下文具有自己的实体视角。我知道在某些情况下,发票有界上下文中的客户实体与运输有界上下文中的客户实体不同,但出于此问题的目的,我们可以假设发票和运输都需要完全相同的客户数据。
我的问题是,在具有多个有界上下文(例如 ERP 系统)的应用程序中,主数据和参考数据是否应该在公共有界上下文中定义,或者这些实体是否应该在每个有界上下文中重复,即使它们包含完全相同的数据?
architecture domain-driven-design master-data-management bounded-contexts
我试图使用Orika在两个包含List<...>
List类型是另一个对象的对象之间进行映射,但是尽管mapperFactory.classMap(...)
我在运行程序时尝试了Orika中映射配置的各种置换,也会引发异常。
查看http://orika-mapper.github.io/orika-docs/mappings-via-classmapbuilder.html,似乎建议映射a的语法List
应为parentProperty{childProperty}
。
出于这个问题的目的,我简化了要映射的对象。源对象是ToDoTaskListEntity
,目标对象是ToDoTaskListDTO
。源对象ToDoItemEntity
包含一个定义为的列表,List<ToDoItemEntity>
目标对象包含一个相应的定义为的ListList<ToDoItemDTO>
我的问题是我应该如何在Orika之间定义映射配置ToDoTaskListEntity
,ToDoTaskListDTO
以使子对象List<ToDoItemEntity>
也映射到List<ToDoItemDTO>
其各自的父对象中?
我的映射配置的代码如下:
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
mapperFactory.classMap(ToDoItemEntity.class, ToDoItemDTO.class)
.field("id", "id")
.field("description", "description")
.field("status", "status")
.byDefault()
.register();
mapperFactory.classMap(ToDoTaskListEntity.class, ToDoTaskListDTO.class)
.field("listName", "listName")
.field("toDoItems{id}", "toDoItems{id}")
.field("toDoItems{description}", "toDoItems{description}")
.field("toDoItems{status}", "toDoItems{status}")
.byDefault()
.register();
Run Code Online (Sandbox Code Playgroud)
调用映射的代码如下:
MapperFacade mapper = mapperFactory.getMapperFacade();
ToDoTaskListDTO toDoTaskListDTO = mapper.map(toDoTaskListEntity, ToDoTaskListDTO.class);
Run Code Online (Sandbox Code Playgroud)
我的源对象的代码如下:
public class ToDoTaskListEntity {
private String ListName;
private List<ToDoItemEntity> …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个新的Jenkins插件,该插件将在Jenkins作业的构建阶段执行,并且要求允许用户在插件的作业配置中指定变量名(与文字值相反)。目的是,当作业执行用户指定的变量名时,该变量名将被与该变量关联的实际值替换,并且插件将在运行perform方法时使用该实际值。
例如,如果MY_VARIABLE
具有该值的变量myValue
是由另一部分作业注入到构建环境中的,并且该值${MY_VARIABLE}
是在作业配置中为我的插件指定的,那么我希望插件${MY_VARIABLE}
用的真实值代替变量myValue
。
做完一些研究后,我了解到Jenkins不会自动将作业配置中的变量替换为其各自的值,这必须由插件处理。我无法解决的是在插件中执行替换的最佳方法。到目前为止,我发现的唯一解决方案是解析从作业配置传递的字符串,以查看它是否与变量的正确模式匹配,然后在我的代码中查找值。
我的问题是,Jenkins API是否提供了更好的解决方案,该解决方案允许我的插件将变量替换为真实值?
我正在研究一个独立的Java应用程序,它从一个MQ队列中获取几条消息,处理消息中包含的数据,然后将新消息PUT到另一个MQ队列.其中一个要求是GET和PUT操作在同一工作单元内,我可以通过指定MQGMO_SYNCPOINT
和MQGMO_SYNCPOINT
获取/放置消息选项来完成此操作.
我不明白如何使用Java MQ API执行MQCMIT和MQBACK操作以显式提交或回滚MQ工作单元.
我在IBM MQ InfoCenter网站和JavaDoc上搜索过但我找不到用于提交和回滚工作单元的API的任何内容.
我正在使用的WebSphere MQ版本是7.5,我使用绑定模式连接到队列管理器.
是否有人能够提供一些示例代码,展示如何使用Java MQ API显式提交或回滚MQ工作单元,或者指向适当的JavaDoc页面的方向?
我想了解从EJB中捕获JPA异常的正确方法是什么.通常,异常将是违反数据库约束或其他一些与数据库相关的错误的结果.
我已尝试在相关EntityManager
调用周围使用try/catch块(例如,删除以从数据库表中删除记录)但未捕获异常.如果我System.out.println
在相关的EntityManager调用之前和之后立即放置了几个语句,那么两个printlns都出现在系统日志中,这表明EntityManager调用本身并没有抛出异常而其他东西正在抛出异常.
我正在开发的应用程序使用JSF前端,而我可以捕获"javax.ejb.EJBException:Transaction aborted"异常,然后打开它以找到JSF支持bean中的根本原因,我必须这样做与将来开发的任何其他前端可能导致重复的代码.
到目前为止,我设法找到的唯一解决方案是使用一个@AroundInvoke
拦截器,该拦截器在InvocationContext.proceed()
函数调用周围放置一个try/catch块,该函数调用捕获a javax.persistence.PersistenceException
然后使用该getCause()
方法展开异常以查看原因是否是许多硬编码异常的实例例如java.sql.SQLIntegrityConstraintViolationException
,如果找到原因会抛出我创建的自定义异常.无论什么代码称为EJB函数,都可以以用户友好的方式将异常报告给用户,而不是作为一个相当无用的"javax.ejb.EJBException:Transaction aborted".
虽然这种方法有效,但它似乎并不是捕获JPA异常的最优雅或最正确的方法.
为了提供一个具体的例子,我有一个EJB,它包含一个用于em.remove()
从数据库表中删除记录的方法.数据库中的另一个表在此表上具有外键约束,如果在表中使用了外键,则会阻止删除行.
如果@AroundInvoke
删除了拦截器,那么EJB中的代码如下:
@PersistenceContext
private EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void deleteLocale(Locale id) {
try {
Object ref = em.getReference(SystemLocale.class, id);
System.out.println("Going to execute em.remove(ref)");
em.remove(ref);
System.out.println("Finished executing em.remove(ref)");
} catch (Exception e) {
System.out.println("Caught an exception " + e.getMessage());
}
}
Run Code Online (Sandbox Code Playgroud)
并抛出以下异常
Local Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: …
Run Code Online (Sandbox Code Playgroud)