How do assemble your JAR file? Are you using maven-shade-plugin or something like that? That may be a problem as it will strip out meta information used by Cayenne's auto-loading mechanics. Can you try to include Java8Module directly, like this:
ServerRuntime.builder().addModule(new Java8Module()) On Thu, Oct 12, 2017 at 6:46 PM, Andrew Willerding <awillerd...@itsurcom.com> wrote: > And if I look in the packaged JAR file I can see the cayenne java8 classes > so I don't understand why there is an issue with it missing? Is there > something else to check or a dependency I'm missing that is needed by > Cayenne to utilize the java8 classes? > > > On 12/10/17 10:58 AM, Nikita Timofeev wrote: >> >> Well, this definitely looks like cayenne-java8 module missing. Cayenne >> tries to store your LocalDateTime as byte[]. >> >> On Thu, Oct 12, 2017 at 4:39 PM, Andrew Willerding >> <awillerd...@itsurcom.com> wrote: >>> >>> Hi Nikita, >>> >>> Your hunch is correct and I'm even more confused. I deleted all the >>> records >>> in the database and re-ran my application. It's complaining of a cast to >>> Date but I don't have any Date fields or objects. Now I'm getting the >>> following exception: >>> >>> org.apache.cayenne.CayenneRuntimeException: [v.4.0.B1 Jun 02 2017 >>> 15:11:18] >>> Commit Exception >>> at >>> org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:774) >>> at >>> org.apache.cayenne.access.DataContext.commitChanges(DataContext.java:691) >>> at >>> com.callistacti.quest.crsolstasv2.ImportThread.run(ImportThread.java:258) >>> at java.lang.Thread.run(Thread.java:748) >>> Caused by: java.sql.SQLException: Cannot convert class [B to SQL type >>> requested due to java.lang.ClassCastException - [B cannot be cast to >>> java.util.Date >>> at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964) >>> at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897) >>> at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886) >>> at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860) >>> at >>> com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:3761) >>> at >>> >>> com.mysql.jdbc.JDBC42PreparedStatement.setObject(JDBC42PreparedStatement.java:99) >>> at >>> com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:3580) >>> at >>> >>> com.mysql.jdbc.JDBC42PreparedStatement.setObject(JDBC42PreparedStatement.java:83) >>> at >>> >>> org.apache.cayenne.access.types.ByteArrayType.setJdbcObject(ByteArrayType.java:157) >>> at >>> >>> org.apache.cayenne.access.types.ByteArrayType.setJdbcObject(ByteArrayType.java:40) >>> at >>> >>> org.apache.cayenne.access.types.ExtendedTypeDecorator.setJdbcObject(ExtendedTypeDecorator.java:63) >>> at >>> org.apache.cayenne.dba.JdbcAdapter.bindParameter(JdbcAdapter.java:548) >>> at >>> >>> org.apache.cayenne.dba.mysql.MySQLAdapter.bindParameter(MySQLAdapter.java:216) >>> at >>> org.apache.cayenne.dba.AutoAdapter.bindParameter(AutoAdapter.java:204) >>> at >>> org.apache.cayenne.access.jdbc.BatchAction.bind(BatchAction.java:57) >>> at >>> >>> org.apache.cayenne.access.jdbc.BatchAction.runAsBatch(BatchAction.java:114) >>> at >>> >>> org.apache.cayenne.access.jdbc.BatchAction.performAction(BatchAction.java:85) >>> at >>> >>> org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:97) >>> at >>> org.apache.cayenne.access.DataNode.performQueries(DataNode.java:293) >>> at >>> >>> org.apache.cayenne.access.DataDomainFlushAction.runQueries(DataDomainFlushAction.java:233) >>> at >>> >>> org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:153) >>> at >>> org.apache.cayenne.access.DataDomain.onSyncFlush(DataDomain.java:633) >>> at >>> org.apache.cayenne.access.DataDomain.onSyncNoFilters(DataDomain.java:603) >>> at >>> >>> org.apache.cayenne.access.DataDomain$DataDomainSyncFilterChain.onSync(DataDomain.java:764) >>> at >>> >>> org.apache.cayenne.tx.TransactionFilter$1.perform(TransactionFilter.java:73) >>> at >>> >>> org.apache.cayenne.tx.TransactionFilter$1.perform(TransactionFilter.java:70) >>> at >>> >>> org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:87) >>> at >>> >>> org.apache.cayenne.tx.DefaultTransactionManager.performInLocalTransaction(DefaultTransactionManager.java:59) >>> at >>> >>> org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:52) >>> at >>> >>> org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:40) >>> at >>> org.apache.cayenne.tx.TransactionFilter.onSync(TransactionFilter.java:70) >>> at >>> >>> org.apache.cayenne.access.DataDomain$DataDomainSyncFilterChain.onSync(DataDomain.java:764) >>> at org.apache.cayenne.access.DataDomain.onSync(DataDomain.java:590) >>> at >>> org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:742) >>> ... 3 more >>> Caused by: java.lang.ClassCastException: [B cannot be cast to >>> java.util.Date >>> at >>> com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:3706) >>> ... 32 more >>> >>> My MySQL table looks like this... >>> >>> >>> +---------------------+-------------+------+-----+---------------------+-----------------------------+ >>> | Field | Type | Null | Key | Default | >>> Extra | >>> >>> +---------------------+-------------+------+-----+---------------------+-----------------------------+ >>> | AccountNumber | varchar(32) | NO | MUL | NULL | >>> | >>> | Active | char(1) | NO | | NULL | >>> | >>> | Address1 | varchar(64) | NO | | NULL | >>> | >>> | Address2 | varchar(64) | YES | | NULL | >>> | >>> | AmountDue | varchar(16) | NO | | NULL | >>> | >>> | City | varchar(32) | YES | | NULL | >>> | >>> | DTCreated | timestamp | NO | | CURRENT_TIMESTAMP | >>> on >>> update CURRENT_TIMESTAMP | >>> | DTUpdated | timestamp | YES | | NULL | >>> | >>> | HashedAccountNumber | varchar(32) | NO | | NULL | >>> | >>> | InvoiceDate | timestamp | NO | | 0000-00-00 00:00:00 | >>> | >>> | PatientName | varchar(64) | NO | | NULL | >>> | >>> | State | varchar(2) | YES | | NULL | >>> | >>> | ZIP | varchar(12) | NO | | NULL | >>> | >>> | id | int(11) | NO | PRI | NULL | >>> | >>> >>> +---------------------+-------------+------+-----+---------------------+-----------------------------+ >>> >>> My class is this... >>> >>> public abstract class _MAMRecords extends CayenneDataObject { >>> >>> private static final long serialVersionUID = 1L; >>> >>> public static final String ID_PK_COLUMN = "id"; >>> >>> public static final Property<String> ACCOUNT_NUMBER = >>> Property.create("accountNumber", String.class); >>> public static final Property<String> ACTIVE = >>> Property.create("active", >>> String.class); >>> public static final Property<String> ADDRESS1 = >>> Property.create("address1", String.class); >>> public static final Property<String> ADDRESS2 = >>> Property.create("address2", String.class); >>> public static final Property<String> AMOUNT_DUE = >>> Property.create("amountDue", String.class); >>> public static final Property<String> CITY = Property.create("city", >>> String.class); >>> public static final Property<LocalDateTime> D_TCREATED = >>> Property.create("dTCreated", LocalDateTime.class); >>> public static final Property<LocalDateTime> D_TUPDATED = >>> Property.create("dTUpdated", LocalDateTime.class); >>> public static final Property<String> HASHED_ACCOUNT_NUMBER = >>> Property.create("hashedAccountNumber", String.class); >>> public static final Property<LocalDateTime> INVOICE_DATE = >>> Property.create("invoiceDate", LocalDateTime.class); >>> public static final Property<String> PATIENT_NAME = >>> Property.create("patientName", String.class); >>> public static final Property<String> STATE = >>> Property.create("state", >>> String.class); >>> public static final Property<String> ZIP = Property.create("zip", >>> String.class); >>> public static final Property<List<Payments>> TO_PAYMENTS = >>> Property.create("toPayments", List.class); >>> >>> >>> >>> On 12/10/17 04:49 AM, Nikita Timofeev wrote: >>>> >>>> Hi Andrew, >>>> >>>> Your last exception seems like a Cayenne fallback to a serializable >>>> type when it doesn't now how to handle given value, are there any >>>> warnings preceding this exception? >>>> Something like "Haven't found suitable ExtendedType for class..."? >>>> >>>> On Wed, Oct 11, 2017 at 9:59 PM, Andrew Willerding >>>> <awillerd...@itsurcom.com> wrote: >>>>> >>>>> Sorry to bug the list but I seemed to have got around the DI issue by >>>>> deleting the Maven references to cayenne and reinstalling them but now >>>>> I'm >>>>> getting another exception. I'm sure I have the correct versions of >>>>> Cayenne >>>>> v4.0.B1 server, java8 and removed di. Am I still missing some dependent >>>>> library? >>>>> >>>>> >>>>> Exception in thread "Thread-2" >>>>> org.apache.cayenne.CayenneRuntimeException: >>>>> [v.4.0.B1 Jun 02 2017 15:11:18] Query exception. >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.DataDomainQueryAction.nextQueryException(DataDomainQueryAction.java:614) >>>>> at >>>>> org.apache.cayenne.access.DataNode.performQueries(DataNode.java:299) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:471) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:72) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.DataDomainQueryAction$2.perform(DataDomainQueryAction.java:446) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:87) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.tx.DefaultTransactionManager.performInLocalTransaction(DefaultTransactionManager.java:59) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:52) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:40) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:443) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:122) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:564) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:748) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.tx.TransactionFilter.onQuery(TransactionFilter.java:49) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:748) >>>>> at >>>>> org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:556) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:382) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:107) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:94) >>>>> at >>>>> org.apache.cayenne.access.DataContext.onQuery(DataContext.java:965) >>>>> at >>>>> >>>>> org.apache.cayenne.access.DataContext.performQuery(DataContext.java:954) >>>>> at org.apache.cayenne.BaseContext.select(BaseContext.java:307) >>>>> at >>>>> org.apache.cayenne.query.FluentSelect.select(FluentSelect.java:157) >>>>> at >>>>> >>>>> com.callistacti.quest.crsolstasv2.ImportThread.run(ImportThread.java:202) >>>>> at java.lang.Thread.run(Thread.java:748) >>>>> Caused by: java.io.StreamCorruptedException: invalid stream header: >>>>> 32303137 >>>>> at >>>>> java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:857) >>>>> at java.io.ObjectInputStream.<init>(ObjectInputStream.java:349) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.types.SerializableTypeFactory$SerializableType.toJavaObject(SerializableTypeFactory.java:106) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.types.SerializableTypeFactory$SerializableType.toJavaObject(SerializableTypeFactory.java:70) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.types.ExtendedTypeDecorator.materializeObject(ExtendedTypeDecorator.java:53) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.jdbc.reader.FullRowReader.readRow(FullRowReader.java:52) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.jdbc.reader.FullRowReader.readRow(FullRowReader.java:32) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.jdbc.JDBCResultIterator.nextRow(JDBCResultIterator.java:104) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.jdbc.JDBCResultIterator.allRows(JDBCResultIterator.java:80) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.jdbc.SelectAction.performAction(SelectAction.java:138) >>>>> at >>>>> >>>>> >>>>> org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:97) >>>>> at >>>>> org.apache.cayenne.access.DataNode.performQueries(DataNode.java:293) >>>>> >>>>> >>>>> >>>>> On 11/10/17 07:16 AM, Andrew Willerding wrote: >>>>>> >>>>>> Hi, >>>>>> >>>>>> I'm not sure what I'm missing when I try to run my application jar >>>>>> file. >>>>>> The intention is to load the cayenne configuration file from the >>>>>> subdirectory etc. >>>>>> >>>>>> I'm getting the following error >>>>>> >>>>>> Exception in thread "main" org.apache.cayenne.di.DIRuntimeException: >>>>>> DI >>>>>> container has no binding for key <BindingKey: >>>>>> org.apache.cayenne.configuration.ObjectContextFactory> >>>>>> at >>>>>> >>>>>> >>>>>> org.apache.cayenne.di.spi.DefaultInjector.getProvider(DefaultInjector.java:158) >>>>>> at >>>>>> >>>>>> >>>>>> org.apache.cayenne.di.spi.DefaultInjector.getProvider(DefaultInjector.java:144) >>>>>> at >>>>>> >>>>>> >>>>>> org.apache.cayenne.di.spi.DefaultInjector.getInstance(DefaultInjector.java:134) >>>>>> at >>>>>> >>>>>> >>>>>> org.apache.cayenne.configuration.CayenneRuntime.newContext(CayenneRuntime.java:124) >>>>>> at >>>>>> com.callistacti.quest.crsolstasv2.CRSolstas.main(CRSolstas.java:114) >>>>>> >>>>>> after executing the following code... >>>>>> >>>>>> public static final String DB_FILE = "cayenne-CRSolstas.xml"; >>>>>> >>>>>> Module myModule = (Binder binder) -> { >>>>>> binder.bind(ResourceLocator.class).toInstance(new >>>>>> FilesystemResourceLocator(new File("etc"))); >>>>>> >>>>>> >>>>>> >>>>>> ServerModule.contributeProperties(binder).put(Constants.SERVER_CONTEXTS_SYNC_PROPERTY, >>>>>> "false"); >>>>>> }; >>>>>> >>>>>> ServerRuntime cayenneRuntime = >>>>>> ServerRuntime.builder().addConfig(DB_FILE) >>>>>> .addModule(myModule) >>>>>> .build(); >>>>>> ObjectContext test = cayenneRuntime.newContext(); >>>>>> test.commitChanges(); >>>>>> >>>>>> When I run my code within my IDE (Netbeans) I do not get this error so >>>>>> I'm >>>>>> missing something from my jar package but I'm not sure what. >>>>>> >>>>>> Thanks, >>>>>> >>>>>> Andrew >>>>>> >>>> >> >> > -- Best regards, Nikita Timofeev