That approach concerns me. Catching RuntimeException essentially opens it up to thousands of possible exceptions that could be the cause, as opposed to looking for that exact cause. I suppose I don't have a choice, though. This apparently just isn't going to work.
Definitely agreed that there is too much going on for a simple Exception class. :-/ Nick On Aug 16, 2013, at 11:45 PM, Ralph Goers wrote: > After following the chain of stuff that gets brought in via BSONObject I > still recommend the approach in my other email of just catching > RuntimeException. A bunch of other classes are being referenced, one of > which is creating a static Logger from java.util.logging. I have no idea why > that might fail but there is just way too much going on for a simple > Exception class. > > Ralph > > On Aug 16, 2013, at 9:26 PM, Nick Williams wrote: > >> https://github.com/mongodb/mongo-java-driver/blob/master/src/main/com/mongodb/DB.java >> >> That also shows an import for org.bson.BSONObject, but the tests still run >> with just DB and no MongoException. org.bson is in the >> org.mongodb:mongo-java-driver JAR file. So, no, that's not the problem. >> There's something else... >> >> Nick >> >> On Aug 16, 2013, at 11:20 PM, Ralph Goers wrote: >> >>> https://github.com/mongodb/mongo-java-driver/blob/master/src/main/com/mongodb/MongoException.java >>> shows an import for org.bson.BSONObject. The pom.xml for >>> mongo-java-driver doesn't contain a transitive dependency for that and mvn >>> dependency:tree on core doesn't show it. >>> >>> Ralph >>> >>> >>> On Aug 16, 2013, at 3:48 PM, Nick Williams wrote: >>> >>>> Guys, I'm having a hard time with this simple fix that should have taken >>>> five minutes. I'm getting test failures due to NoClassDefFoundErrors that >>>> shouldn't happen. >>>> >>>> Here are the tests in error: >>>> CategoryTest.setupClass:52 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.testTraceWithException:415 ? NoClassDefFound >>>> com/mongodb/MongoExcep... >>>> LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.testLog:459 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.testRB1:295 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.testRB2:314 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.testRB3:334 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.testTrace:388 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.testAdditivity1:119 ? NoClassDefFound >>>> com/mongodb/MongoException >>>> LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.testAdditivity2:144 ? NoClassDefFound >>>> com/mongodb/MongoException >>>> LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.testAdditivity3:183 ? NoClassDefFound >>>> com/mongodb/MongoException >>>> LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.testIsTraceEnabled:443 ? NoClassDefFound >>>> com/mongodb/MongoException >>>> LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.testExists:355 ? NoClassDefFound com/mongodb/MongoException >>>> LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException >>>> LoggingTest.setupClass:44 ? NoClassDefFound com/mongodb/MongoException >>>> LoggingTest.cleanupClass:49 NullPointer >>>> >>>> Here's the code I added: >>>> >>>> try { >>>> if (!database.authenticate(username, >>>> password.toCharArray())) { >>>> LOGGER.error("Failed to authenticate against >>>> MongoDB server. Unknown error."); >>>> } >>>> } catch (MongoException e) { >>>> LOGGER.error("Failed to authenticate against MongoDB: >>>> " + e.getMessage(), e); >>>> } catch (IllegalStateException e) { >>>> LOGGER.error("Factory-supplied MongoDB database >>>> connection already authenticated with different" + >>>> "credentials but lost connection."); >>>> } >>>> >>>> Problem is, "database" is an instance of com.mongodb.DB, which is in the >>>> same JAR as com.mongodb.MongoException. If I remove this code, the tests >>>> pass. How is this possible? The DB instance is there with or without this >>>> new code, which means the JAR is on the classpath, which means >>>> MongoException should be on the classpath. >>>> >>>> Very confused... >>>> >>>> Nick >>>> >>>> On Aug 16, 2013, at 5:13 PM, Gary Gregory wrote: >>>> >>>>> Thank you for the update Nick! >>>>> :) >>>>> Gary >>>>> >>>>> >>>>> On Fri, Aug 16, 2013 at 5:39 PM, Nick Williams >>>>> <nicho...@nicholaswilliams.net> wrote: >>>>> Answers inline. >>>>> >>>>> On Aug 14, 2013, at 2:10 AM, YuCheng Ting wrote: >>>>> >>>>>> Hi all, >>>>>> >>>>>> I use beta8 log4j2 and wrote log4j2.xml like example in document >>>>>> (http://logging.apache.org/log4j/2.x/manual/appenders.html#NoSQLAppender >>>>>> ): >>>>>> >>>>>> >>>>>> <appenders> >>>>>> <NoSql name="databaseAppender"> >>>>>> <MongoDb databaseName="applicationDb" >>>>>> collectionName="applicationLog" >>>>>> server="mongo.example.org" >>>>>> username="loggingUser" password="abc123" /> >>>>>> </NoSql> >>>>>> </appenders> >>>>> >>>>> Yep. That's correct. >>>>> >>>>>> but I get the two exception: >>>>>> >>>>>> 1, "can't serialize class org.apache.logging.log4j.Level" exception in >>>>>> (BasicBSONEncoder.java:270), I read the code and add follow code in my >>>>>> project before logging, it gone. >>>>>> >>>>>> BSON.addEncodingHook(org.apache.logging.log4j.Level.class, new >>>>>> Transformer() { >>>>>> @Override >>>>>> public Object transform(Object o) { >>>>>> return o.toString(); >>>>>> } >>>>>> }); >>>>> >>>>> This bug was reported and fixed a few weeks ago. The fix will be in the >>>>> next version, or you can compile locally. >>>>> https://issues.apache.org/jira/browse/LOG4J2-330 >>>>> >>>>>> 2, “not authorized for insert test.log”, because my MongoDB need auth to >>>>>> write, but the the "username" and "password" attributes in log4j2.xml is >>>>>> nearly useless, after I read source code, found it NOT auth in >>>>>> >>>>>> org.apache.logging.log4j.core.appender.db.nosql.mongo.MongoDBProvider.createNoSQLProvider >>>>>> source code line 181 after check username and password and >>>>>> com.mongodb.DB.authenticate never be called. >>>>> >>>>> This is a bug. I'm reporting it and fixing it now. The fix will be in the >>>>> next version, or you can compile locally (after I get the change >>>>> committed, of course). >>>>> >>>>>> so I change log4j2.xml : >>>>>> >>>>>> <NoSql name="mongodb"> >>>>>> <MongoDb collectionName="log" databaseName="test" >>>>>> factoryClassName="com.yuchs.test.log4j.MainTest" >>>>>> factoryMethodName="getMongoClient" /> >>>>>> </NoSql> >>>>>> >>>>>> and create MongoClient and call com.mongodb.DB.authenticate method in >>>>>> com.yuchs.test.log4j.MainTest.getMongoClient. >>>>>> >>>>>> >>>>>> This is my question: >>>>>> >>>>>> 1, Why not add BSON.addEncodingHook code into log4j2 project to avoid >>>>>> basic exception ? or another rule of method I don't know ? >>>>>> >>>>>> 2, Why not auth DB in log4j2 project if password and username is set in >>>>>> log4j2.xml ? or another rule of method I don't know ? >>>>>> >>>>>> Thanks everyone! >>>>>> >>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>>> Java Persistence with Hibernate, Second Edition >>>>> JUnit in Action, Second Edition >>>>> Spring Batch in Action >>>>> Blog: http://garygregory.wordpress.com >>>>> Home: http://garygregory.com/ >>>>> Tweet! http://twitter.com/GaryGregory >>>> >>> >> >