Skip to content

Commit bd4b1d3

Browse files
committed
Fix NPE when properties of bean are manually indexed
When bean's properties ordering has been annotated (@Index), NullPointerException in ReflectionBeansTemplateBuilder#toFieldEntries(Class, FieldOption) will occur if annotated order is different than introspected order.
1 parent 8b3ead2 commit bd4b1d3

11 files changed

+988
-1
lines changed

src/main/java/org/msgpack/template/builder/ReflectionBeansTemplateBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ public FieldEntry[] toFieldEntries(Class<?> targetClass, FieldOption implicitOpt
131131
throw new TemplateBuildException("invalid index: " + index);
132132
}
133133
entries[index] = new BeansFieldEntry(p);
134-
props[index] = null;
134+
props[i] = null;
135135
}
136136
}
137137
int insertIndex = 0;

src/test/java/org/msgpack/TestMessagePack02.java

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import org.junit.Test;
99
import org.msgpack.testclasses.EnumTypeFieldsClass;
1010
import org.msgpack.testclasses.EnumTypeFieldsClassNotNullable;
11+
import org.msgpack.testclasses.IndexedFieldsBeanClass;
12+
import org.msgpack.testclasses.IndexedFieldsBeanClassNotNullable;
1113
import org.msgpack.testclasses.InheritanceClass;
1214
import org.msgpack.testclasses.InheritanceClassNotNullable;
1315
import org.msgpack.testclasses.ListTypeFieldsClass;
@@ -2555,6 +2557,234 @@ public void testReferenceCycleTypeFieldsClassNotNullable(ReferenceCycleTypeField
25552557
}
25562558
}
25572559

2560+
public static class TestIndexedFieldsBeanClassBufferPackBufferUnpack extends org.msgpack.template.builder.TestSet {
2561+
@Test @Override
2562+
public void testIndexedFieldsBeanClass() throws Exception {
2563+
super.testIndexedFieldsBeanClass();
2564+
}
2565+
2566+
@Override
2567+
public void testIndexedFieldsBeanClass(IndexedFieldsBeanClass v) throws Exception {
2568+
MessagePack msgpack = new MessagePack();
2569+
byte[] bytes = msgpack.write(v);
2570+
IndexedFieldsBeanClass ret = msgpack.read(bytes, IndexedFieldsBeanClass.class);
2571+
assertEquals(v, ret);
2572+
}
2573+
}
2574+
2575+
public static class TestIndexedFieldsBeanClassBufferPackConvert extends org.msgpack.template.builder.TestSet {
2576+
@Test @Override
2577+
public void testIndexedFieldsBeanClass() throws Exception {
2578+
super.testIndexedFieldsBeanClass();
2579+
}
2580+
2581+
@Override
2582+
public void testIndexedFieldsBeanClass(IndexedFieldsBeanClass v) throws Exception {
2583+
MessagePack msgpack = new MessagePack();
2584+
byte[] bytes = msgpack.write(v);
2585+
Value value = msgpack.read(bytes);
2586+
IndexedFieldsBeanClass ret = msgpack.convert(value, IndexedFieldsBeanClass.class);
2587+
assertEquals(v, ret);
2588+
}
2589+
}
2590+
2591+
public static class TestIndexedFieldsBeanClassBufferPackUnpack extends org.msgpack.template.builder.TestSet {
2592+
@Test @Override
2593+
public void testIndexedFieldsBeanClass() throws Exception {
2594+
super.testIndexedFieldsBeanClass();
2595+
}
2596+
2597+
@Override
2598+
public void testIndexedFieldsBeanClass(IndexedFieldsBeanClass v) throws Exception {
2599+
MessagePack msgpack = new MessagePack();
2600+
byte[] bytes = msgpack.write(v);
2601+
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
2602+
IndexedFieldsBeanClass ret = msgpack.read(in, IndexedFieldsBeanClass.class);
2603+
assertEquals(v, ret);
2604+
}
2605+
}
2606+
2607+
public static class TestIndexedFieldsBeanClassPackBufferUnpack extends org.msgpack.template.builder.TestSet {
2608+
@Test @Override
2609+
public void testIndexedFieldsBeanClass() throws Exception {
2610+
super.testIndexedFieldsBeanClass();
2611+
}
2612+
2613+
@Override
2614+
public void testIndexedFieldsBeanClass(IndexedFieldsBeanClass v) throws Exception {
2615+
MessagePack msgpack = new MessagePack();
2616+
ByteArrayOutputStream out = new ByteArrayOutputStream();
2617+
msgpack.write(out, v);
2618+
byte[] bytes = out.toByteArray();
2619+
IndexedFieldsBeanClass ret = msgpack.read(bytes, IndexedFieldsBeanClass.class);
2620+
assertEquals(v, ret);
2621+
}
2622+
}
2623+
2624+
public static class TestIndexedFieldsBeanClassPackConvert extends org.msgpack.template.builder.TestSet {
2625+
@Test @Override
2626+
public void testIndexedFieldsBeanClass() throws Exception {
2627+
super.testIndexedFieldsBeanClass();
2628+
}
2629+
2630+
@Override
2631+
public void testIndexedFieldsBeanClass(IndexedFieldsBeanClass v) throws Exception {
2632+
MessagePack msgpack = new MessagePack();
2633+
ByteArrayOutputStream out = new ByteArrayOutputStream();
2634+
msgpack.write(out, v);
2635+
byte[] bytes = out.toByteArray();
2636+
Value value = msgpack.read(bytes);
2637+
IndexedFieldsBeanClass ret = msgpack.convert(value, IndexedFieldsBeanClass.class);
2638+
assertEquals(v, ret);
2639+
}
2640+
}
2641+
2642+
public static class TestIndexedFieldsBeanClassPackUnpack extends org.msgpack.template.builder.TestSet {
2643+
@Test @Override
2644+
public void testIndexedFieldsBeanClass() throws Exception {
2645+
super.testIndexedFieldsBeanClass();
2646+
}
2647+
2648+
@Override
2649+
public void testIndexedFieldsBeanClass(IndexedFieldsBeanClass v) throws Exception {
2650+
MessagePack msgpack = new MessagePack();
2651+
ByteArrayOutputStream out = new ByteArrayOutputStream();
2652+
msgpack.write(out, v);
2653+
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
2654+
IndexedFieldsBeanClass ret = msgpack.read(in, IndexedFieldsBeanClass.class);
2655+
assertEquals(v, ret);
2656+
}
2657+
}
2658+
2659+
public static class TestIndexedFieldsBeanClassUnconvertConvert extends org.msgpack.template.builder.TestSet {
2660+
@Test @Override
2661+
public void testIndexedFieldsBeanClass() throws Exception {
2662+
super.testIndexedFieldsBeanClass();
2663+
}
2664+
2665+
@Override
2666+
public void testIndexedFieldsBeanClass(IndexedFieldsBeanClass v) throws Exception {
2667+
MessagePack msgpack = new MessagePack();
2668+
Value value = msgpack.unconvert(v);
2669+
IndexedFieldsBeanClass ret = msgpack.convert(value, IndexedFieldsBeanClass.class);
2670+
assertEquals(v, ret);
2671+
}
2672+
}
2673+
2674+
public static class TestIndexedFieldsBeanClassNotNullableBufferPackBufferUnpack extends org.msgpack.template.builder.TestSet {
2675+
@Test @Override
2676+
public void testIndexedFieldsBeanClassNotNullable() throws Exception {
2677+
super.testIndexedFieldsBeanClassNotNullable();
2678+
}
2679+
2680+
@Override
2681+
public void testIndexedFieldsBeanClassNotNullable(IndexedFieldsBeanClassNotNullable v) throws Exception {
2682+
MessagePack msgpack = new MessagePack();
2683+
byte[] bytes = msgpack.write(v);
2684+
IndexedFieldsBeanClassNotNullable ret = msgpack.read(bytes, IndexedFieldsBeanClassNotNullable.class);
2685+
assertEquals(v, ret);
2686+
}
2687+
}
2688+
2689+
public static class TestIndexedFieldsBeanClassNotNullableBufferPackConvert extends org.msgpack.template.builder.TestSet {
2690+
@Test @Override
2691+
public void testIndexedFieldsBeanClassNotNullable() throws Exception {
2692+
super.testIndexedFieldsBeanClassNotNullable();
2693+
}
2694+
2695+
@Override
2696+
public void testIndexedFieldsBeanClassNotNullable(IndexedFieldsBeanClassNotNullable v) throws Exception {
2697+
MessagePack msgpack = new MessagePack();
2698+
byte[] bytes = msgpack.write(v);
2699+
Value value = msgpack.read(bytes);
2700+
IndexedFieldsBeanClassNotNullable ret = msgpack.convert(value, IndexedFieldsBeanClassNotNullable.class);
2701+
assertEquals(v, ret);
2702+
}
2703+
}
2704+
2705+
public static class TestIndexedFieldsBeanClassNotNullableBufferPackUnpack extends org.msgpack.template.builder.TestSet {
2706+
@Test @Override
2707+
public void testIndexedFieldsBeanClassNotNullable() throws Exception {
2708+
super.testIndexedFieldsBeanClassNotNullable();
2709+
}
2710+
2711+
@Override
2712+
public void testIndexedFieldsBeanClassNotNullable(IndexedFieldsBeanClassNotNullable v) throws Exception {
2713+
MessagePack msgpack = new MessagePack();
2714+
byte[] bytes = msgpack.write(v);
2715+
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
2716+
IndexedFieldsBeanClassNotNullable ret = msgpack.read(in, IndexedFieldsBeanClassNotNullable.class);
2717+
assertEquals(v, ret);
2718+
}
2719+
}
2720+
2721+
public static class TestIndexedFieldsBeanClassNotNullablePackBufferUnpack extends org.msgpack.template.builder.TestSet {
2722+
@Test @Override
2723+
public void testIndexedFieldsBeanClassNotNullable() throws Exception {
2724+
super.testIndexedFieldsBeanClassNotNullable();
2725+
}
2726+
2727+
@Override
2728+
public void testIndexedFieldsBeanClassNotNullable(IndexedFieldsBeanClassNotNullable v) throws Exception {
2729+
MessagePack msgpack = new MessagePack();
2730+
ByteArrayOutputStream out = new ByteArrayOutputStream();
2731+
msgpack.write(out, v);
2732+
byte[] bytes = out.toByteArray();
2733+
IndexedFieldsBeanClassNotNullable ret = msgpack.read(bytes, IndexedFieldsBeanClassNotNullable.class);
2734+
assertEquals(v, ret);
2735+
}
2736+
}
2737+
2738+
public static class TestIndexedFieldsBeanClassNotNullablePackConvert extends org.msgpack.template.builder.TestSet {
2739+
@Test @Override
2740+
public void testIndexedFieldsBeanClassNotNullable() throws Exception {
2741+
super.testIndexedFieldsBeanClassNotNullable();
2742+
}
2743+
2744+
@Override
2745+
public void testIndexedFieldsBeanClassNotNullable(IndexedFieldsBeanClassNotNullable v) throws Exception {
2746+
MessagePack msgpack = new MessagePack();
2747+
ByteArrayOutputStream out = new ByteArrayOutputStream();
2748+
msgpack.write(out, v);
2749+
byte[] bytes = out.toByteArray();
2750+
Value value = msgpack.read(bytes);
2751+
IndexedFieldsBeanClassNotNullable ret = msgpack.convert(value, IndexedFieldsBeanClassNotNullable.class);
2752+
assertEquals(v, ret);
2753+
}
2754+
}
2755+
2756+
public static class TestIndexedFieldsBeanClassNotNullablePackUnpack extends org.msgpack.template.builder.TestSet {
2757+
@Test @Override
2758+
public void testIndexedFieldsBeanClassNotNullable() throws Exception {
2759+
super.testIndexedFieldsBeanClassNotNullable();
2760+
}
2761+
2762+
@Override
2763+
public void testIndexedFieldsBeanClassNotNullable(IndexedFieldsBeanClassNotNullable v) throws Exception {
2764+
MessagePack msgpack = new MessagePack();
2765+
ByteArrayOutputStream out = new ByteArrayOutputStream();
2766+
msgpack.write(out, v);
2767+
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
2768+
IndexedFieldsBeanClassNotNullable ret = msgpack.read(in, IndexedFieldsBeanClassNotNullable.class);
2769+
assertEquals(v, ret);
2770+
}
2771+
}
2772+
2773+
public static class TestIndexedFieldsBeanClassNotNullableUnconvertConvert extends org.msgpack.template.builder.TestSet {
2774+
@Test @Override
2775+
public void testIndexedFieldsBeanClassNotNullable() throws Exception {
2776+
super.testIndexedFieldsBeanClassNotNullable();
2777+
}
2778+
2779+
@Override
2780+
public void testIndexedFieldsBeanClassNotNullable(IndexedFieldsBeanClassNotNullable v) throws Exception {
2781+
MessagePack msgpack = new MessagePack();
2782+
Value value = msgpack.unconvert(v);
2783+
IndexedFieldsBeanClassNotNullable ret = msgpack.convert(value, IndexedFieldsBeanClassNotNullable.class);
2784+
assertEquals(v, ret);
2785+
}
2786+
}
2787+
25582788
public static class TestInheritanceClassBufferPackBufferUnpack extends org.msgpack.template.builder.TestSet {
25592789
@Test @Override
25602790
public void testInheritanceClass() throws Exception {

src/test/java/org/msgpack/template/builder/TestReflectionBeansBufferPackBufferUnpack.java

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import org.msgpack.template.Template;
1212
import org.msgpack.testclasses.AbstractClass;
1313
import org.msgpack.testclasses.FinalClass;
14+
import org.msgpack.testclasses.IndexedFieldsBeanClass;
15+
import org.msgpack.testclasses.IndexedFieldsBeanClassNotNullable;
1416
import org.msgpack.testclasses.InheritanceClass;
1517
import org.msgpack.testclasses.InheritanceClassNotNullable;
1618
import org.msgpack.testclasses.Interface;
@@ -389,6 +391,99 @@ public void testReferenceCycleTypeFieldsClassNotNullable(ReferenceCycleTypeField
389391
assertEquals(bytes.length, unpacker.getReadByteCount());
390392
}
391393

394+
@Test @Override
395+
public void testIndexedFieldsBeanClass() throws Exception {
396+
super.testIndexedFieldsBeanClass();
397+
}
398+
399+
@Override
400+
public void testIndexedFieldsBeanClass(IndexedFieldsBeanClass v) throws Exception {
401+
MessagePack msgpack = new MessagePack();
402+
TemplateRegistry registry = new TemplateRegistry(null);
403+
ReflectionBeansTemplateBuilder builder = new ReflectionBeansTemplateBuilder(registry);
404+
Template<IndexedFieldsBeanClass> tmpl = builder.buildTemplate(IndexedFieldsBeanClass.class);
405+
BufferPacker packer = msgpack.createBufferPacker();
406+
tmpl.write(packer, v);
407+
byte[] bytes = packer.toByteArray();
408+
BufferUnpacker unpacker = msgpack.createBufferUnpacker();
409+
unpacker.resetReadByteCount();
410+
unpacker.wrap(bytes);
411+
IndexedFieldsBeanClass ret = tmpl.read(unpacker, null);
412+
assertEquals(v, ret);
413+
assertEquals(bytes.length, unpacker.getReadByteCount());
414+
}
415+
416+
@Override
417+
public void testIndexedFieldsBeanClassFieldsUnpackedInOrder(IndexedFieldsBeanClass v) throws Exception {
418+
MessagePack msgpack = new MessagePack();
419+
TemplateRegistry registry = new TemplateRegistry(null);
420+
ReflectionBeansTemplateBuilder builder = new ReflectionBeansTemplateBuilder(registry);
421+
Template<IndexedFieldsBeanClass> tmpl = builder.buildTemplate(IndexedFieldsBeanClass.class);
422+
BufferPacker packer = msgpack.createBufferPacker();
423+
tmpl.write(packer, v);
424+
byte[] bytes = packer.toByteArray();
425+
BufferUnpacker unpacker = msgpack.createBufferUnpacker();
426+
unpacker.resetReadByteCount();
427+
unpacker.wrap(bytes);
428+
429+
unpacker.readArrayBegin();
430+
assertEquals("alpha", unpacker.readString());
431+
assertEquals("bravo", unpacker.readString());
432+
assertEquals("charlie", unpacker.readString());
433+
assertEquals("delta", unpacker.readString());
434+
assertEquals("echo", unpacker.readString());
435+
unpacker.readArrayEnd();
436+
437+
assertEquals(bytes.length, unpacker.getReadByteCount());
438+
}
439+
440+
@Test @Override
441+
public void testIndexedFieldsBeanClassNotNullable() throws Exception {
442+
super.testIndexedFieldsBeanClassNotNullable();
443+
}
444+
445+
@Override
446+
public void testIndexedFieldsBeanClassNotNullable(IndexedFieldsBeanClassNotNullable v) throws Exception {
447+
MessagePack msgpack = new MessagePack();
448+
TemplateRegistry registry = new TemplateRegistry(null);
449+
ReflectionBeansTemplateBuilder builder = new ReflectionBeansTemplateBuilder(registry);
450+
Template<IndexedFieldsBeanClassNotNullable> tmpl = builder.buildTemplate(IndexedFieldsBeanClassNotNullable.class);
451+
BufferPacker packer = msgpack.createBufferPacker();
452+
tmpl.write(packer, v);
453+
byte[] bytes = packer.toByteArray();
454+
BufferUnpacker unpacker = msgpack.createBufferUnpacker();
455+
unpacker.resetReadByteCount();
456+
unpacker.wrap(bytes);
457+
IndexedFieldsBeanClassNotNullable ret = tmpl.read(unpacker, null);
458+
assertEquals(v, ret);
459+
assertEquals(bytes.length, unpacker.getReadByteCount());
460+
}
461+
462+
463+
@Override
464+
public void testIndexedFieldsBeanClassNotNullableFieldsUnpackedInOrder(IndexedFieldsBeanClassNotNullable v) throws Exception {
465+
MessagePack msgpack = new MessagePack();
466+
TemplateRegistry registry = new TemplateRegistry(null);
467+
ReflectionBeansTemplateBuilder builder = new ReflectionBeansTemplateBuilder(registry);
468+
Template<IndexedFieldsBeanClassNotNullable> tmpl = builder.buildTemplate(IndexedFieldsBeanClassNotNullable.class);
469+
BufferPacker packer = msgpack.createBufferPacker();
470+
tmpl.write(packer, v);
471+
byte[] bytes = packer.toByteArray();
472+
BufferUnpacker unpacker = msgpack.createBufferUnpacker();
473+
unpacker.resetReadByteCount();
474+
unpacker.wrap(bytes);
475+
476+
unpacker.readArrayBegin();
477+
assertEquals("alpha", unpacker.readString());
478+
assertEquals("bravo", unpacker.readString());
479+
assertEquals("charlie", unpacker.readString());
480+
assertEquals("delta", unpacker.readString());
481+
assertEquals("echo", unpacker.readString());
482+
unpacker.readArrayEnd();
483+
484+
assertEquals(bytes.length, unpacker.getReadByteCount());
485+
}
486+
392487
@Test @Override
393488
public void testInheritanceClass() throws Exception {
394489
super.testInheritanceClass();

0 commit comments

Comments
 (0)