Skip to content

Commit d697143

Browse files
authored
Throw if a non-Instant field is annotated with @TimeColumn (#974)
1 parent 5f066d1 commit d697143

File tree

2 files changed

+36
-14
lines changed

2 files changed

+36
-14
lines changed

src/main/java/org/influxdb/dto/Point.java

+20-14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.influxdb.dto;
22

33
import org.influxdb.BuilderException;
4+
import org.influxdb.InfluxDBMapperException;
45
import org.influxdb.annotation.Column;
56
import org.influxdb.annotation.Exclude;
67
import org.influxdb.annotation.Measurement;
@@ -322,20 +323,25 @@ private void addFieldByAttribute(final Object pojo, final Field field, final boo
322323
Object fieldValue = field.get(pojo);
323324

324325
TimeColumn tc = field.getAnnotation(TimeColumn.class);
325-
if (tc != null && Instant.class.isAssignableFrom(field.getType())) {
326-
Optional.ofNullable((Instant) fieldValue).ifPresent(instant -> {
327-
TimeUnit timeUnit = tc.timeUnit();
328-
if (timeUnit == TimeUnit.NANOSECONDS || timeUnit == TimeUnit.MICROSECONDS) {
329-
this.time = BigInteger.valueOf(instant.getEpochSecond())
330-
.multiply(NANOSECONDS_PER_SECOND)
331-
.add(BigInteger.valueOf(instant.getNano()))
332-
.divide(BigInteger.valueOf(TimeUnit.NANOSECONDS.convert(1, timeUnit)));
333-
} else {
334-
this.time = timeUnit.convert(instant.toEpochMilli(), TimeUnit.MILLISECONDS);
335-
}
336-
this.precision = timeUnit;
337-
});
338-
return;
326+
if (tc != null) {
327+
if (Instant.class.isAssignableFrom(field.getType())) {
328+
Optional.ofNullable((Instant) fieldValue).ifPresent(instant -> {
329+
TimeUnit timeUnit = tc.timeUnit();
330+
if (timeUnit == TimeUnit.NANOSECONDS || timeUnit == TimeUnit.MICROSECONDS) {
331+
this.time = BigInteger.valueOf(instant.getEpochSecond())
332+
.multiply(NANOSECONDS_PER_SECOND)
333+
.add(BigInteger.valueOf(instant.getNano()))
334+
.divide(BigInteger.valueOf(TimeUnit.NANOSECONDS.convert(1, timeUnit)));
335+
} else {
336+
this.time = timeUnit.convert(instant.toEpochMilli(), TimeUnit.MILLISECONDS);
337+
}
338+
this.precision = timeUnit;
339+
});
340+
return;
341+
}
342+
343+
throw new InfluxDBMapperException(
344+
"Unsupported type " + field.getType() + " for time: should be of Instant type");
339345
}
340346

341347
if (tag) {

src/test/java/org/influxdb/dto/PointTest.java

+16
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.influxdb.BuilderException;
44
import org.influxdb.InfluxDB;
5+
import org.influxdb.InfluxDBMapperException;
56
import org.influxdb.annotation.Column;
67
import org.influxdb.annotation.Measurement;
78
import org.influxdb.annotation.TimeColumn;
@@ -712,6 +713,13 @@ public void testAddFieldsFromPOJOWithTimeColumnSeconds() throws NoSuchFieldExcep
712713
Assertions.assertEquals(pojo.time.getEpochSecond(), timeField.get(p));
713714
}
714715

716+
@Test
717+
public void testAddFieldsFromPOJOWithBadTimeColumn() {
718+
BadTimeColumnPojo pojo = new BadTimeColumnPojo();
719+
Assertions.assertThrows(InfluxDBMapperException.class,
720+
() -> Point.measurementByPOJO(pojo.getClass()).addFieldsFromPOJO(pojo).build());
721+
}
722+
715723
@Test
716724
public void testAddFieldsFromPOJOWithTimeColumnNull() throws NoSuchFieldException, IllegalAccessException {
717725
TimeColumnPojo pojo = new TimeColumnPojo();
@@ -939,6 +947,14 @@ static class TimeColumnPojoSec {
939947
Instant time;
940948
}
941949

950+
@Measurement(name = "tcmeasurement", allFields = true)
951+
static class BadTimeColumnPojo {
952+
boolean booleanPrimitive;
953+
954+
@TimeColumn
955+
String time;
956+
}
957+
942958
@Measurement(name = "mymeasurement")
943959
static class Pojo {
944960

0 commit comments

Comments
 (0)