diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/ExceptionAsserts.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/ExceptionAsserts.java
index 6479a12..777ea0b 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/ExceptionAsserts.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/ExceptionAsserts.java
@@ -16,14 +16,11 @@
  */
 package org.apache.johnzon.jsonb;
 
-import org.apache.johnzon.mapper.Mapper;
-import org.apache.johnzon.mapper.MapperBuilder;
 import org.junit.Assert;
 
 import javax.json.bind.Jsonb;
 import javax.json.bind.JsonbBuilder;
 import javax.json.bind.JsonbConfig;
-import javax.json.bind.JsonbException;
 import java.io.ByteArrayOutputStream;
 import java.lang.reflect.Type;
 import java.util.concurrent.Callable;
@@ -51,7 +48,7 @@
         Assert.assertSame(expected, throwable);
         return this;
     }
-    
+
     public ExceptionAsserts assertCauseChain(final Throwable expected) {
         Throwable cause = throwable;
         while ((cause = cause.getCause()) != null) {
@@ -84,7 +81,7 @@
     public static ExceptionAsserts from(final Runnable runnable) {
         return from(runnable);
     }
-    
+
     public static ExceptionAsserts from(final Callable<?> runnable) {
         try {
 
diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbBeanSetterUserExceptionsTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbBeanSetterUserExceptionsTest.java
new file mode 100644
index 0000000..531276c
--- /dev/null
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbBeanSetterUserExceptionsTest.java
@@ -0,0 +1,479 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.johnzon.jsonb;
+
+import org.junit.Test;
+
+import javax.json.bind.JsonbException;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+public class JsonbBeanSetterUserExceptionsTest {
+
+    private static final RuntimeException USER_EXCEPTION = new RuntimeException("I am user, hear me roar");
+
+    @Test
+    public void object() {
+        assertException("{ \"object\" : {\"red\": 255, \"green\": 165, \"blue\":0} }",
+                "Widget property 'object' of type Color cannot be mapped to json object value: {\"red\":255,\"green\":1.." +
+                        ".\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget.setObjec" +
+                        "t(org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Color)");
+    }
+
+    @Test
+    public void string() {
+        assertException("{ \"string\" : \"Supercalifragilisticexpialidocious\" }",
+                "Widget property 'string' of type String cannot be mapped to json string value: \"Supercalifragilisti." +
+                        "..\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget.setStri" +
+                        "ng(java.lang.String)");
+    }
+
+    @Test
+    public void number() {
+        assertException("{ \"number\" : 122333444455555.666666777777788888888 }",
+                "Widget property 'number' of type Double cannot be mapped to json numeric value: 122333444455555.6666" +
+                        "...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget.setNum" +
+                        "ber(java.lang.Double)");
+    }
+
+    @Test
+    public void intPrimitive() {
+        assertException("{ \"intPrimitive\" : 42 }",
+                "Widget property 'intPrimitive' of type int cannot be mapped to json numeric value: 42\nError calling " +
+                        "public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget.setIntPrimitive(int)");
+    }
+
+    @Test
+    public void booleanValue() {
+        assertException("{ \"bool\" : true }",
+                "Widget property 'bool' of type Boolean cannot be mapped to json boolean value: true\nError calling pu" +
+                        "blic void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget.setBool(java.lang.Boolean)");
+    }
+
+    @Test
+    public void boolPrimitive() {
+        assertException("{ \"boolPrimitive\" : true }",
+                "Widget property 'boolPrimitive' of type boolean cannot be mapped to json boolean value: true\nError c" +
+                        "alling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget.setBoolPrimitive(" +
+                        "boolean)");
+    }
+
+    @Test
+    public void enumeration() {
+        assertException("{ \"unit\" : \"SECONDS\" }",
+                "Widget property 'unit' of type TimeUnit cannot be mapped to json string value: \"SECONDS\"\nError calli" +
+                        "ng public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget.setUnit(java.util.con" +
+                        "current.TimeUnit)");
+    }
+
+    @Test
+    public void date() {
+        assertException("{ \"date\" : \"2022-05-08T22:04:10.328Z[UTC]\" }",
+                "Widget property 'date' of type Date cannot be mapped to json string value: \"2022-05-08T22:04:10...\n" +
+                        "Error calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget.setDate(java" +
+                        ".util.Date)");
+    }
+
+    @Test
+    public void arrayOfObject() {
+        assertException("{ \"arrayOfObject\" : [{\"red\": 255, \"green\": 165, \"blue\":0},{\"red\": 0, \"green\": 45, \"blue\":127}] }",
+                "Widget property 'arrayOfObject' of type Color[] cannot be mapped to json array value: [{\"red\":255,\"g" +
+                        "reen\":...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget." +
+                        "setArrayOfObject(org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Color[])");
+    }
+
+    @Test
+    public void arrayOfString() {
+        assertException("{ \"arrayOfString\" : [\"Klaatu\", \"barada\", \"nikto\"] }",
+                "Widget property 'arrayOfString' of type String[] cannot be mapped to json array value: [\"Klaatu\",\"ba" +
+                        "rada\",\"...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget" +
+                        ".setArrayOfString(java.lang.String[])");
+    }
+
+    @Test
+    public void arrayOfNumber() {
+        assertException("{ \"arrayOfNumber\" : [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] }",
+                "Widget property 'arrayOfNumber' of type Number[] cannot be mapped to json array value: [2,3,5,7,11,1" +
+                        "3,17,19...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget" +
+                        ".setArrayOfNumber(java.lang.Number[])");
+    }
+
+    @Test
+    public void arrayOfBoolean() {
+        assertException("{ \"arrayOfBoolean\" : [true,false,true,true,false] }",
+                "Widget property 'arrayOfBoolean' of type Boolean[] cannot be mapped to json array value: [true,false" +
+                        ",true,tru...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widg" +
+                        "et.setArrayOfBoolean(java.lang.Boolean[])");
+    }
+
+    @Test
+    public void arrayOfInt() {
+        assertException("{ \"arrayOfInt\" : [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] }",
+                "Widget property 'arrayOfInt' of type int[] cannot be mapped to json array value: [2,3,5,7,11,13,17,1" +
+                        "9...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget.setAr" +
+                        "rayOfInt(int[])");
+    }
+
+    @Test
+    public void arrayOfByte() {
+        assertException("{ \"arrayOfByte\" : [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] }",
+                "Widget property 'arrayOfByte' of type byte[] cannot be mapped to json array value: [2,3,5,7,11,13,17" +
+                        ",19...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget.set" +
+                        "ArrayOfByte(byte[])");
+    }
+
+    @Test
+    public void arrayOfChar() {
+        assertException("{ \"arrayOfChar\" : [\"a\",\"a\",\"a\",\"a\",\"a\",\"a\",\"a\",\"a\"] }",
+                "Widget property 'arrayOfChar' of type char[] cannot be mapped to json array value: [\"a\",\"a\",\"a\",\"a\"," +
+                        "\"a\"...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget.set" +
+                        "ArrayOfChar(char[])");
+    }
+
+    @Test
+    public void arrayOfShort() {
+        assertException("{ \"arrayOfShort\" : [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] }",
+                "Widget property 'arrayOfShort' of type short[] cannot be mapped to json array value: [2,3,5,7,11,13," +
+                        "17,19...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget.s" +
+                        "etArrayOfShort(short[])");
+    }
+
+    @Test
+    public void arrayOfLong() {
+        assertException("{ \"arrayOfLong\" : [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] }",
+                "Widget property 'arrayOfLong' of type long[] cannot be mapped to json array value: [2,3,5,7,11,13,17" +
+                        ",19...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget.set" +
+                        "ArrayOfLong(long[])");
+    }
+
+    @Test
+    public void arrayOfFloat() {
+        assertException("{ \"arrayOfFloat\" : [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] }",
+                "Widget property 'arrayOfFloat' of type float[] cannot be mapped to json array value: [2,3,5,7,11,13," +
+                        "17,19...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget.s" +
+                        "etArrayOfFloat(float[])");
+    }
+
+    @Test
+    public void arrayOfDouble() {
+        assertException("{ \"arrayOfDouble\" : [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] }",
+                "Widget property 'arrayOfDouble' of type double[] cannot be mapped to json array value: [2,3,5,7,11,1" +
+                        "3,17,19...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widget" +
+                        ".setArrayOfDouble(double[])");
+    }
+
+    @Test
+    public void arrayOfBooleanPrimitive() {
+        assertException("{ \"arrayOfBooleanPrimitive\" : [true,false,true,true,false] }",
+                "Widget property 'arrayOfBooleanPrimitive' of type boolean[] cannot be mapped to json array value: [t" +
+                        "rue,false,true,tru...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptions" +
+                        "Test$Widget.setArrayOfBooleanPrimitive(boolean[])");
+    }
+
+    @Test
+    public void listOfObject() {
+        assertException("{ \"listOfObject\" : [{\"red\": 255, \"green\": 165, \"blue\":0},{\"red\": 0, \"green\": 45, \"blue\":127}] }",
+                "Widget property 'listOfObject' of type List<Color> cannot be mapped to json array value: [{\"red\":255" +
+                        ",\"green\":...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Widg" +
+                        "et.setListOfObject(java.util.List)");
+    }
+
+    @Test
+    public void listOfString() {
+        assertException("{ \"listOfString\" : [\"Klaatu\", \"barada\", \"nikto\"] }",
+                "Widget property 'listOfString' of type List<String> cannot be mapped to json array value: [\"Klaatu\"," +
+                        "\"barada\",\"...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Wid" +
+                        "get.setListOfString(java.util.List)");
+    }
+
+    @Test
+    public void listOfNumber() {
+        assertException("{ \"listOfNumber\" : [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] }",
+                "Widget property 'listOfNumber' of type List<Number> cannot be mapped to json array value: [2,3,5,7,1" +
+                        "1,13,17,19...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$Wid" +
+                        "get.setListOfNumber(java.util.List)");
+    }
+
+    @Test
+    public void listOfBoolean() {
+        assertException("{ \"listOfBoolean\" : [true,false,true,true,false] }",
+                "Widget property 'listOfBoolean' of type List<Boolean> cannot be mapped to json array value: [true,fa" +
+                        "lse,true,tru...\nError calling public void org.apache.johnzon.jsonb.JsonbBeanSetterUserExceptionsTest$W" +
+                        "idget.setListOfBoolean(java.util.List)");
+    }
+
+    private void assertException(final String json, final String expected) {
+        ExceptionAsserts.fromJson(json, Widget.class)
+                .assertInstanceOf(JsonbException.class)
+                .assertMessage(expected)
+                .assertCauseChain(USER_EXCEPTION);
+    }
+
+    public static class Widget {
+        private Color[] arrayOfObject;
+        private String[] arrayOfString;
+        private Number[] arrayOfNumber;
+        private int[] arrayOfInt;
+        private byte[] arrayOfByte;
+        private char[] arrayOfChar;
+        private short[] arrayOfShort;
+        private long[] arrayOfLong;
+        private float[] arrayOfFloat;
+        private double[] arrayOfDouble;
+        private Boolean[] arrayOfBoolean;
+        private boolean[] arrayOfBooleanPrimitive;
+        private List<Color> listOfObject;
+        private List<String> listOfString;
+        private List<Number> listOfNumber;
+        private List<Boolean> listOfBoolean;
+        private Color object;
+        private String string;
+        private Double number;
+        private int intPrimitive;
+        private Boolean bool;
+        private boolean boolPrimitive;
+        private Date date;
+        private TimeUnit unit;
+
+        public Color[] getArrayOfObject() {
+            return arrayOfObject;
+        }
+
+        public void setArrayOfObject(final Color[] arrayOfObject) {
+            throw USER_EXCEPTION;
+        }
+
+        public String[] getArrayOfString() {
+            return arrayOfString;
+        }
+
+        public void setArrayOfString(final String[] arrayOfString) {
+            throw USER_EXCEPTION;
+        }
+
+        public Number[] getArrayOfNumber() {
+            return arrayOfNumber;
+        }
+
+        public void setArrayOfNumber(final Number[] arrayOfNumber) {
+            throw USER_EXCEPTION;
+        }
+
+        public int[] getArrayOfInt() {
+            return arrayOfInt;
+        }
+
+        public void setArrayOfInt(final int[] arrayOfint) {
+            throw USER_EXCEPTION;
+        }
+
+        public Boolean[] getArrayOfBoolean() {
+            return arrayOfBoolean;
+        }
+
+        public void setArrayOfBoolean(final Boolean[] arrayOfBoolean) {
+            throw USER_EXCEPTION;
+        }
+
+        public boolean[] getArrayOfBooleanPrimitive() {
+            return arrayOfBooleanPrimitive;
+        }
+
+        public void setArrayOfBooleanPrimitive(final boolean[] arrayOfBooleanPrimitive) {
+            throw USER_EXCEPTION;
+        }
+
+        public Color getObject() {
+            return object;
+        }
+
+        public void setObject(final Color object) {
+            throw USER_EXCEPTION;
+        }
+
+        public String getString() {
+            return string;
+        }
+
+        public void setString(final String string) {
+            throw USER_EXCEPTION;
+        }
+
+        public Double getNumber() {
+            return number;
+        }
+
+        public void setNumber(final Double number) {
+            throw USER_EXCEPTION;
+        }
+
+        public int getIntPrimitive() {
+            return intPrimitive;
+        }
+
+        public void setIntPrimitive(final int intPrimitive) {
+            throw USER_EXCEPTION;
+        }
+
+        public Boolean getBool() {
+            return bool;
+        }
+
+        public void setBool(final Boolean bool) {
+            throw USER_EXCEPTION;
+        }
+
+        public boolean isBoolPrimitive() {
+            return boolPrimitive;
+        }
+
+        public void setBoolPrimitive(final boolean boolPrimitive) {
+            throw USER_EXCEPTION;
+        }
+
+        public Date getDate() {
+            return date;
+        }
+
+        public void setDate(final Date date) {
+            throw USER_EXCEPTION;
+        }
+
+        public TimeUnit getUnit() {
+            return unit;
+        }
+
+        public void setUnit(final TimeUnit unit) {
+            throw USER_EXCEPTION;
+        }
+
+        public byte[] getArrayOfByte() {
+            return arrayOfByte;
+        }
+
+        public void setArrayOfByte(final byte[] arrayOfByte) {
+            throw USER_EXCEPTION;
+        }
+
+        public char[] getArrayOfChar() {
+            return arrayOfChar;
+        }
+
+        public void setArrayOfChar(final char[] arrayOfChar) {
+            throw USER_EXCEPTION;
+        }
+
+        public short[] getArrayOfShort() {
+            return arrayOfShort;
+        }
+
+        public void setArrayOfShort(final short[] arrayOfShort) {
+            throw USER_EXCEPTION;
+        }
+
+        public long[] getArrayOfLong() {
+            return arrayOfLong;
+        }
+
+        public void setArrayOfLong(final long[] arrayOfLong) {
+            throw USER_EXCEPTION;
+        }
+
+        public float[] getArrayOfFloat() {
+            return arrayOfFloat;
+        }
+
+        public void setArrayOfFloat(final float[] arrayOfFloat) {
+            throw USER_EXCEPTION;
+        }
+
+        public double[] getArrayOfDouble() {
+            return arrayOfDouble;
+        }
+
+        public void setArrayOfDouble(final double[] arrayOfDouble) {
+            throw USER_EXCEPTION;
+        }
+
+        public List<Color> getListOfObject() {
+            return listOfObject;
+        }
+
+        public void setListOfObject(final List<Color> listOfObject) {
+            throw USER_EXCEPTION;
+        }
+
+        public List<String> getListOfString() {
+            return listOfString;
+        }
+
+        public void setListOfString(final List<String> listOfString) {
+            throw USER_EXCEPTION;
+        }
+
+        public List<Number> getListOfNumber() {
+            return listOfNumber;
+        }
+
+        public void setListOfNumber(final List<Number> listOfNumber) {
+            throw USER_EXCEPTION;
+        }
+
+        public List<Boolean> getListOfBoolean() {
+            return listOfBoolean;
+        }
+
+        public void setListOfBoolean(final List<Boolean> listOfBoolean) {
+            throw USER_EXCEPTION;
+        }
+
+    }
+
+    public static class Color {
+        int red;
+        int green;
+        int blue;
+
+        public Color() {
+        }
+
+        public int getRed() {
+            return red;
+        }
+
+        public void setRed(final int red) {
+            this.red = red;
+        }
+
+        public int getGreen() {
+            return green;
+        }
+
+        public void setGreen(final int green) {
+            this.green = green;
+        }
+
+        public int getBlue() {
+            return blue;
+        }
+
+        public void setBlue(final int blue) {
+            this.blue = blue;
+        }
+    }
+}
