Filtering environment specific configuration files
TweetPosted on Tuesday Mar 04, 2014 at 04:45PM in Technology
Environment
- Apache Maven 3.1.1
- Jenkins 1.551
- Eclipse Kepler SR1
- Oracle JDK7u51
- PostgreSQL 9.2.4
- OS X 10.9.2
Requirement
- I'm searching an appropriate way to define environment specific configuration.
- I don't want to create separate files for each environment.
- I don't want to define environment specific information on pom.xml.
Where to define?
- There are some candidates for achieve it with Maven.
- Maven Properties
- Maven can reference it as ${name}.
- Java System Properties
- Maven can reference it as ${name}.
- Environment Variables
- Maven can reference it as ${env.name}.
- Maven Properties
Maven Properties
- User-local properties are can be defined on ~/.m2/settings.xml
- It's easy to define on Jenkins jobs through configuration of MAVEN_OPTS.
- We can specify it like: “-Dname=value”
- We have to take care on Eclipse to make sure select a profile explicitly.
- activeByDefault won't work on some cases[8].
- I go with this way at this time.
Java System Properties
- We need to define it through arguments of java command.
- It's annoying to define on Eclipse.
- I can't found any way on define globally for Run Configuration.
- Thus, I have to configure it for each programs. It's pretty annoying.
- It's easy to define it on Jenkins jobs through configuration of MAVEN_OPTS.
- We can specify it like: “-Dname=value”
Environment Variables
- We need to define it through platform-specific way.
- But any programs can reference it through cross-platform way.
- I guess it's more cross-platform way than Java System Properties.
- We need a plugin[2] for Jenkins to define environment variables in jobs.
- I guess it's not bad to achieve it.
- But it's might not a good idea to storing security informations such as password.
Sample
- This sample executes simple SQL which acquires the name of connected database.
- Assume PostgreSQL is running at localhost:5432 and database named “kyle”, “testdb”, “testdb001” are exists.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.nailedtothex</groupId> <artifactId>mavenprops</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> <dependencies> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.3-1100-jdbc41</version> </dependency> </dependencies> </project>
~/.m2/settings.xml
- This defines variables of the development environment with Eclipse.
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <profiles> <profile> <id>development</id> <properties> <hogeApp.jdbc.url>jdbc:postgresql://localhost:5432/kyle</hogeApp.jdbc.url> <hogeApp.jdbc.user>kyle</hogeApp.jdbc.user> <hogeApp.jdbc.password>***</hogeApp.jdbc.password> </properties> </profile> </profiles> </settings>
Activate the profile on Eclipse explicitly
Right-click the project - Maven - Select Maven Profiles
Check “development” - OK
main/resources/jdbc.properties
url=${hogeApp.jdbc.url} user=${hogeApp.jdbc.user} password=${hogeApp.jdbc.password}
Main.java
package mavenprops; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Properties; public class Main { public static void main(String[] args) throws Exception { Properties info = new Properties(); try (InputStream is = Main.class.getResourceAsStream("/jdbc.properties")) { info.load(is); } try (Connection cn = DriverManager.getConnection(info.getProperty("url"), info); Statement st = cn.createStatement(); ResultSet rs = st.executeQuery("select current_database()")) { rs.next(); System.out.println("current_database(): " + rs.getString(1)); } } }
Run
Run on Eclipse
current_database(): kyle
- The database specified in ~/.m2/settings.xml is shown.
Run from command-line
kyle-no-MacBook:mavenprops kyle$ mvn clean compile exec:java -Dexec.mainClass="mavenprops.Main" -DhogeApp.jdbc.url=jdbc:postgresql://localhost:5432/testdb -DhogeApp.jdbc.user=kyle -DhogeApp.jdbc.password=*** Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building mavenprops 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ mavenprops --- [INFO] Deleting /Users/kyle/Documents/workspace/mavenprops/target [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ mavenprops --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 1 resource [INFO] [INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ mavenprops --- [INFO] Compiling 1 source file to /Users/kyle/Documents/workspace/mavenprops/target/classes [INFO] [INFO] >>> exec-maven-plugin:1.2.1:java (default-cli) @ mavenprops >>> [INFO] [INFO] <<< exec-maven-plugin:1.2.1:java (default-cli) @ mavenprops <<< [INFO] [INFO] --- exec-maven-plugin:1.2.1:java (default-cli) @ mavenprops --- current_database(): testdb [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.333s [INFO] Finished at: Tue Mar 04 18:25:25 JST 2014 [INFO] Final Memory: 13M/245M [INFO] ------------------------------------------------------------------------ kyle-no-MacBook:mavenprops kyle$
- The database specified at the command-line arguments is shown.
kyle-no-MacBook:mavenprops kyle$ cat target/classes/jdbc.properties url=jdbc:postgresql://localhost:5432/testdb user=kyle password=***
- Filter worked as expectedly.
How to apply this method on Jenkins job
- We can specify the variables on the configure of the job like this:
Build log
<===[JENKINS REMOTING CAPACITY]===>channel started log4j:WARN No appenders could be found for logger (org.apache.commons.beanutils.converters.BooleanConverter). log4j:WARN Please initialize the log4j system properly. Executing Maven: -B -f /Users/Shared/Jenkins/Home/jobs/MavenProps/workspace/mavenprops/pom.xml clean compile exec:java [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building mavenprops 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ mavenprops --- [INFO] Deleting /Users/Shared/Jenkins/Home/jobs/MavenProps/workspace/mavenprops/target [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ mavenprops --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 1 resource [INFO] [INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ mavenprops --- [INFO] Compiling 1 source file to /Users/Shared/Jenkins/Home/jobs/MavenProps/workspace/mavenprops/target/classes [INFO] [INFO] >>> exec-maven-plugin:1.2.1:java (default-cli) @ mavenprops >>> [WARNING] Failed to getClass for org.codehaus.mojo.exec.ExecJavaMojo [INFO] [INFO] <<< exec-maven-plugin:1.2.1:java (default-cli) @ mavenprops <<< [INFO] [INFO] --- exec-maven-plugin:1.2.1:java (default-cli) @ mavenprops --- current_database(): testdb001 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.472s [INFO] Finished at: Tue Mar 04 19:08:39 JST 2014 [INFO] Final Memory: 15M/245M [INFO] ------------------------------------------------------------------------ [JENKINS] Archiving /Users/Shared/Jenkins/Home/jobs/MavenProps/workspace/mavenprops/pom.xml to org.nailedtothex/mavenprops/0.0.1-SNAPSHOT/mavenprops-0.0.1-SNAPSHOT.pom channel stopped Finished: SUCCESS
- The database specified at configured in the job is shown.
jdbc.properties on the workspace of Jenkins
- Filter worked expectedly.
References
- フィルタリング
- EnvInject Plugin - Jenkins - Jenkins Wiki
- Setting the system-wide PATH environment variable in Mavericks - Ask Different
- HowTo: Set an Environment Variable in Mac OS X - /etc/launchd.conf - Dowd and Associates
- Maven Settings Example - Users | Community
- maven-war-pluginで環境ごとの設定ファイルを管理してみた - Challenge Java EE !
- I can't get maven to use properties defined in ~/.m2/settings.xml? - Stack Overflow
- Happy Wide Grove: Eclipse+maven+m2e+JavaFX2
Tags: maven
Comparison of 2 ways of integration testing: Arquillian and Remote EJB
TweetPosted on Tuesday Mar 04, 2014 at 06:51AM in Technology
Arquillian
Pros
- It enables us to testing of all kind of beans or methods.
- CDI Managed Beans
- EJBs that have only no interface view or local interface
- Methods what returns/receives object which not serializable
- everything
- There are many various ways of manipulating testing package.
- e.g. adding data source definition or persistence descriptor (persistence.xml) for testing purpose is easy because of useful ShrinkWrap.
- We can keep the package for testing deployment smaller.
- We can create smaller deployment package which contains only necessary resources for each test case.
Cons
- It needs deployment for each test execution.
- It brings longer deployment time for some cases. if you can keep test packages smaller or you can use faster embedded containers, you might think that it's not problem at all.
- When I want to execute all of test classes, It will execute deployment many times (same as numbers of test classes). I guess it's inefficient.
- Also there are some ways to avoid it such as creating delegate test classes, but I think it's annoying.
- It takes some times for making test package.
- It gives us great ability to manipulate test package with ShrinkWrap, but it takes some time for making test package. it needs to make WAR or EAR through scanning all necessary classes and dependencies (jar files), for each test execution.
- Dependency resolving is annoying.
- We can manipulate what testing package contains completely with Arquillian, but I guess it's annoying for some cases.
- I have tried to resolve dependencies through Arquillian's Maven Plug-in API, but sometimes I got unexpected result which different with standalone Maven (such as exclusion, etc), and resolving is need to be executed for each test execution.
- We have to include testing dependencies such as Mockito or DBUnit on the deployment.
- I know it's not a problem for many cases, I just feel it is not likely to me. I guess that these are not required on the server-side.
Remote EJB
Pros
- We can control the time of deployment completely.
- We can execute many test classes for deployment only once.
- It reduces many deployment time and test execution time for some cases.
- We can do testing against pure production resources.
- We don't need to another preparation of testing packages through resolving resources and dependencies.
- It depends on only more simply and standardized technologies.
- We don't need to mark @RunWith(Arquillian.class) on test classes.
- All we need is just lookup the remote bean on the method marked @Before, and invoke target method.
Cons
- Testable resources are limited on EJBs that have remote interface.
- We can't test CDI Managed Beans on this way.
- All of method parameters and return object are need to be serializable.
- Also larger serializable objects in the test would make testing performance worse.
- We have to create remote interfaces for beans that needs to be tested.
- It's annoying, and remote interfaces are unnecessary for production environment at some occasions.
- EJBs are considered as heavier than CDI Managed Beans.
- Performance of remote EJB lookups may vary between environments.
- I experienced that it takes 1 second or more with GlassFish3.
- Now I'm using WildFly 8.0.0Final, it takes only some milli-seconds.
- We have to deploy the whole application package for every testing.
- Larger application needs more time for deployment.
- So, we have to keep the size of projects at appropriate size.
Conclusion and how to overcome cons
- I prefer Remote EJB at present time.
- Annoying preparation of remote interfaces are not pain as much to me.
- we can make remote interfaces this way, it needs only small amount of additional code:
public interface BusinessDayUtil { boolean isBusinessDay(Date date); Date addDays(Date date, int days); @javax.ejb.Remote interface Remote extends BusinessDayUtil { } @javax.ejb.Local interface Local extends BusinessDayUtil { } }
- Implementation class:
@Stateless public class BusinessDayUtilImpl implements BusinessDayUtil.Local, BusinessDayUtil.Remote { ...
- And we can inject the bean through local-view easily:
public class MyJobOperatorImpl implements JobOperator { @Inject BusinessDayUtil.Local businessDayUtil; ...
- We don't want to EJBs to wrapping Exceptions with EJBException at some occasions.
- It can avoid on application classes with annotate @ApplicationException
- Also can achieve on API classes through placement of ejb-jar.xml.
- I know it's a sidetracking topic, but I wrote for just a note for me.
<?xml version="1.0" encoding="UTF-8"?> <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"> <assembly-descriptor> <application-exception> <exception-class>javax.persistence.NoResultException</exception-class> <rollback>true</rollback> </application-exception> </assembly-descriptor> </ejb-jar>
- Making all of arguments and return object serializable is impossible at some occasions.
- Such as use of InputStream or OutputStream
- But I guess we can take the old way which stick with plain JUnit testing with mocking frameworks, at such occasions.
Tags: test
Avoiding EJBException wrapping
TweetPosted on Sunday Mar 02, 2014 at 03:33PM in Technology
How to avoid EJBException wrapping.
Environment
- WildFly 8.0.0.Final
- Oracle JDK7u51
How?
- We can avoid EJBException wrapping with @ApplicationException annotation.
- Also API classes (e.g. NoResultException) can be specified in WEB-INF/ejb-jar.xml.
Project
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.nailedtothex</groupId> <artifactId>avoidejbexception</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <properties> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <failOnMissingWebXml>false</failOnMissingWebXml> </properties> <dependencies> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency> </dependencies> </project>
Stateless Session Bean
package org.nailedtothex.ex; import javax.ejb.Stateless; import javax.persistence.NoResultException; @Stateless public class MyEJB { public void throwIllegalArgumentException(){ throw new IllegalArgumentException(); } public void throwNoResultException(){ throw new NoResultException(); } public void throwMyApplicationException(){ throw new MyApplicationException(); } }
Servlet
package org.nailedtothex.ex; import java.io.IOException; import javax.inject.Inject; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/*") public class MyServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Inject MyEJB myEJB; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { StringBuilder sb = new StringBuilder(); try{ myEJB.throwNoResultException(); }catch(Exception e){ sb.append("throwNoResultException() thrown: ").append(e.getClass()).append('\n'); } try{ myEJB.throwIllegalArgumentException(); }catch(Exception e){ sb.append("throwIllegalArgumentException() thrown: ").append(e.getClass()).append('\n'); } try{ myEJB.throwMyApplicationException(); }catch(Exception e){ sb.append("throwMyApplicationException() thrown: ").append(e.getClass()); } System.out.println(sb); } }
MyApplicationException
package org.nailedtothex.ex; import java.io.Serializable; import javax.ejb.ApplicationException; @ApplicationException public class MyApplicationException extends RuntimeException implements Serializable { private static final long serialVersionUID = 1L; }
/WEB-INF/ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?> <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"> <assembly-descriptor> <application-exception> <exception-class>javax.persistence.NoResultException</exception-class> <rollback>true</rollback> </application-exception> </assembly-descriptor> </ejb-jar>
- Taken from [1].
Log
16:21:39,152 INFO [stdout] (default task-13) throwNoResultException() thrown: class javax.persistence.NoResultException 16:21:39,152 INFO [stdout] (default task-13) throwIllegalArgumentException() thrown: class javax.ejb.EJBException 16:21:39,153 INFO [stdout] (default task-13) throwMyApplicationException() thrown: class org.nailedtothex.ex.MyApplicationException
Whole Log
16:21:39,146 ERROR [org.jboss.as.ejb3.invocation] (default task-13) JBAS014134: EJB Invocation failed on component MyEJB for method public void org.nailedtothex.ex.MyEJB.throwIllegalArgumentException(): javax.ejb.EJBException: java.lang.IllegalArgumentException at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:190) [wildfly-ejb3-8.0.0.Final.jar:8.0.0.Final] at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:275) [wildfly-ejb3-8.0.0.Final.jar:8.0.0.Final] at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:340) [wildfly-ejb3-8.0.0.Final.jar:8.0.0.Final] at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:239) [wildfly-ejb3-8.0.0.Final.jar:8.0.0.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41) [wildfly-ejb3-8.0.0.Final.jar:8.0.0.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.ejb3.component.invocationmetrics.WaitTimeInterceptor.processInvocation(WaitTimeInterceptor.java:43) [wildfly-ejb3-8.0.0.Final.jar:8.0.0.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.ejb3.security.SecurityContextInterceptor.processInvocation(SecurityContextInterceptor.java:95) [wildfly-ejb3-8.0.0.Final.jar:8.0.0.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.java:64) [wildfly-ejb3-8.0.0.Final.jar:8.0.0.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:59) [wildfly-ejb3-8.0.0.Final.jar:8.0.0.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:55) [wildfly-ejb3-8.0.0.Final.jar:8.0.0.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:64) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:326) at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:448) at org.jboss.invocation.AccessCheckingInterceptor.processInvocation(AccessCheckingInterceptor.java:61) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:326) at org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation(PrivilegedWithCombinerInterceptor.java:80) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:185) at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:182) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) at org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:73) at org.nailedtothex.ex.MyEJB$$$view1064.throwIllegalArgumentException(Unknown Source) [classes:] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_51] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_51] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_51] at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_51] at org.jboss.weld.util.reflection.Reflections.invokeAndUnwrap(Reflections.java:401) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23] at org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler.invoke(EnterpriseBeanProxyMethodHandler.java:99) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23] at org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance.invoke(EnterpriseTargetBeanInstance.java:56) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23] at org.jboss.weld.bean.proxy.InjectionPointPropagatingEnterpriseTargetBeanInstance.invoke(InjectionPointPropagatingEnterpriseTargetBeanInstance.java:65) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23] at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23] at org.nailedtothex.ex.MyEJB$Proxy$_$$_Weld$EnterpriseProxy$.throwIllegalArgumentException(Unknown Source) [classes:] at org.nailedtothex.ex.MyServlet.doGet(MyServlet.java:30) [classes:] at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final] at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final] at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.0.Final.jar:1.0.0.Final] at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:113) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] at io.undertow.security.handlers.AuthenticationCallHandler.handleRequest(AuthenticationCallHandler.java:52) [undertow-core-1.0.0.Final.jar:1.0.0.Final] at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) [undertow-core-1.0.0.Final.jar:1.0.0.Final] at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:61) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.0.0.Final.jar:1.0.0.Final] at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.0.Final.jar:1.0.0.Final] at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.0.Final.jar:1.0.0.Final] at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.0.Final.jar:1.0.0.Final] at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:240) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:73) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:146) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] at io.undertow.server.Connectors.executeRootHandler(Connectors.java:168) [undertow-core-1.0.0.Final.jar:1.0.0.Final] at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:687) [undertow-core-1.0.0.Final.jar:1.0.0.Final] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_51] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_51] at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_51] Caused by: java.lang.IllegalArgumentException at org.nailedtothex.ex.MyEJB.throwIllegalArgumentException(MyEJB.java:10) [classes:] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_51] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_51] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_51] at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_51] at org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:52) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53) at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:407) at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.doMethodInterception(Jsr299BindingsInterceptor.java:82) [wildfly-weld-8.0.0.Final.jar:8.0.0.Final] at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:93) [wildfly-weld-8.0.0.Final.jar:8.0.0.Final] at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53) at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.ejb3.component.invocationmetrics.ExecutionTimeInterceptor.processInvocation(ExecutionTimeInterceptor.java:43) [wildfly-ejb3-8.0.0.Final.jar:8.0.0.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.jpa.interceptor.SBInvocationInterceptor.processInvocation(SBInvocationInterceptor.java:47) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:407) at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:46) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23] at org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:83) [wildfly-weld-8.0.0.Final.jar:8.0.0.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45) [wildfly-ee-8.0.0.Final.jar:8.0.0.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:21) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) at org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:53) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.ejb3.component.interceptors.NonPooledEJBComponentInstanceAssociatingInterceptor.processInvocation(NonPooledEJBComponentInstanceAssociatingInterceptor.java:59) [wildfly-ejb3-8.0.0.Final.jar:8.0.0.Final] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:273) [wildfly-ejb3-8.0.0.Final.jar:8.0.0.Final] ... 70 more 16:21:39,152 INFO [stdout] (default task-13) throwNoResultException() thrown: class javax.persistence.NoResultException 16:21:39,152 INFO [stdout] (default task-13) throwIllegalArgumentException() thrown: class javax.ejb.EJBException 16:21:39,153 INFO [stdout] (default task-13) throwMyApplicationException() thrown: class org.nailedtothex.ex.MyApplicationException
- Stacktraces of application exception were not logged.
Specifying java.lang.RuntimeException as an application exception in ejb-jar.xml
log
16:26:13,256 INFO [stdout] (default task-12) throwNoResultException() thrown: class javax.persistence.NoResultException 16:26:13,256 INFO [stdout] (default task-12) throwIllegalArgumentException() thrown: class java.lang.IllegalArgumentException 16:26:13,256 INFO [stdout] (default task-12) throwMyApplicationException() thrown: class org.nailedtothex.ex.MyApplicationException
- Seems to be working.
Specifying java.lang.Exception as an application exception in ejb-jar.xml
log
16:26:54,294 INFO [stdout] (default task-1) throwNoResultException() thrown: class javax.ejb.EJBException 16:26:54,294 INFO [stdout] (default task-1) throwIllegalArgumentException() thrown: class javax.ejb.EJBException 16:26:54,294 INFO [stdout] (default task-1) throwMyApplicationException() thrown: class org.nailedtothex.ex.MyApplicationException
- Not working?
References
Tags: ejb