johnzon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From David Blevins <david.blev...@gmail.com>
Subject Improving "Missing @JsonbCreator argument" message
Date Thu, 23 Jul 2020 02:39:52 GMT
Hey All!

I'd really like to improve the above error message, but I would like to do it in a way that
has the highest chance to be merged so first asking for guidance.

Ideally the message would tell me:

 1) the class annotated with @JsonbCreator
 2) the arguments that are missing

A very optional, but would be slick:

 3) that the `johnzon.failOnMissingCreatorValues` flag exists

The most obvious trick to this is that the validation is done in a lambda here:

 - https://github.com/apache/johnzon/blob/master/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java#L223

However the data we would need to produce an informative message is here:

 - https://github.com/apache/johnzon/blob/master/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java#L322

This is me brainstorming as I type, but I can imagine a few ways this could be solved:

 1) Move the lambda down to after the `if` block that sets `final String[] params`, then we
have what we need to build a better message.

 2) Replace the lambda `factoryValidator.accept(params)` with a plain method call `validateFactory(clazz,
params, args)`.  We'd need to rename `public Object create(final Object[] params)` to public
Object create(final Object[] args)` so there's no conflict with the `String[] params` in the
outter method signature.

 3) Make the `factoryValidator` lambda throw a subclass of JsonbException that has a field
indicating the `args` array positions that are null.  Then make `public Object create(final
Object[] params)` method catch it, match up the missing arg positions with the names and wrap
the exception with a more detailed exception.

 4) Change the lambda from `final Consumer<Object[]> factoryValidator` to something
like `final Consumer<FactoryMetadata> factoryValidator` and introduce a small inner
class FactoryMetadata that has clazz, params, args as fields.

Possibly some other options jump out at others.

If I don't hear anything, I'll pick one and see how it goes.  While I'm at it I'd like to
improve the other error messages in the area so at minimum they say the affected class:

 - https://github.com/apache/johnzon/blob/master/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java#L192
 - https://github.com/apache/johnzon/blob/master/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java#L206
 - https://github.com/apache/johnzon/blob/master/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java#L292



-David


Mime
View raw message