Oh, I realized it... Yes, you are totally right and I missed that the whole
point that the purpose of JsonDeserializer is returning an
already-deserialized object. But for some reason I mixed it up with what
should create an instance (i.e. `InstanceCreator` in Gson terms that I'm
more familiar with). For example, the following code works and fails as
expected:
final ClassLoader classLoader = IUserDto.class.getClassLoader();
final ObjectMapper objectMapper = new ObjectMapper();
final IUserDto.IUserCreateDto userCreateDto = (IUserDto.IUserCreateDto)
Proxy.newProxyInstance(classLoader, new Class[]{
IUserDto.IUserCreateDto.class }, (proxy, method, argz) -> {
throw new AssertionError("This never happens");
});
objectMapper.readerForUpdating(userCreateDto).readValue("{\"name\":\"John\"}");
System.out.println(userCreateDto.getClass());
I must learn more about what ValueInstantiator is. This sounds exactly what
I'm looking for. Apologies for the wasted time.
On Wednesday, August 15, 2018 at 4:45:20 PM UTC+3, Tatu Saloranta wrote:
>
> On Wed, Aug 15, 2018 at 5:05 AM, Lyubomyr Shaydariv
> <[email protected] <javascript:>> wrote:
> > Thanks for the reply, Tatu.
> >
> > Unfortunately, 2.6.7 works exactly the same like 2.6.3 does. However, if
> I
> > switch to 2.9.6 (and I hope I'll migrate the project I work at too), the
> > output is slightly different: `class com.sun.proxy.$Proxy0`. The
> assertion
> > error is never thrown though.
>
> Hmmh. Looking at that, although I am not familiar with usage of Proxy
> instances, it seems to me that
> behavior here makes sense -- nothing in code is triggering any of
> accessors so no exception is thrown.
> Usage of Proxy here does not actually matter, as databind is not
> really (nor needs to be) aware of its use.
>
> Shouldn't code try to call `getName()` to trigger exception or something?
> All Jackson does is invoke `deserialize()` method, which invokes
> creation of proxied instance. But since
> custom deserializes are expected to handle all actual deserialization
> logic, including reading of JSON value
> and setting values of Java object created, there is no other action.
>
> I am guessing you might be expecting that only instance was created,
> and then Jackson would handle content,
> call setters, in which case exception would be expected. This is
> possible using `ValueInstantiator` handler, although
> bit more work. But plain `JsonDeserializer` delegates all work from
> databind.
>
> I hope this makes sense.
>
> -+ Tatu +-
>
> >
> >
> > On Wednesday, August 15, 2018 at 1:58:14 PM UTC+3, Tatu Saloranta wrote:
> >>
> >> On Tue, Aug 14, 2018 at 1:30 PM, Lyubomyr Shaydariv
> >> <[email protected]> wrote:
> >> > Hello,
> >> >
> >> > I've faced with an issue where I need to work with dynamic proxies
> since
> >> > I
> >> > find them a very convenient way allowing to reduce the amount of code
> >> > dramatically. Please consider the following code:
> >> >
> >> > interface IUserDto {
> >> >
> >> > @JsonProperty(value = "name", access = JsonProperty.Access.READ_ONLY)
> >> > String getName();
> >> >
> >> > void setName(String name);
> >> >
> >> > interface IUserCreateDto
> >> > extends IUserDto {
> >> >
> >> > @JsonProperty(value = "name", access =
> JsonProperty.Access.WRITE_ONLY,
> >> > required = true)
> >> > void setName(String name);
> >> >
> >> > }
> >> >
> >> > static void main(final String... args)
> >> > throws IOException {
> >> > final ClassLoader classLoader = IUserDto.class.getClassLoader();
> >> > final ObjectMapper objectMapper = new ObjectMapper();
> >> > objectMapper.registerModule(new SimpleModule()
> >> > .addDeserializer(IUserCreateDto.class, new
> >> > JsonDeserializer<IUserCreateDto>() {
> >> > @Override
> >> > public IUserCreateDto deserialize(final JsonParser parser, final
> >> > DeserializationContext context) {
> >> > return (IUserCreateDto) Proxy.newProxyInstance(classLoader, new
> Class[]{
> >> > IUserCreateDto.class }, (proxy, method, args) -> {
> >> > throw new AssertionError("This never happens");
> >> > });
> >> > }
> >> > })
> >> > );
> >> > final IUserCreateDto userCreateDto =
> >> > objectMapper.readValue("{\"name\":\"John\"}", IUserCreateDto.class);
> >> > System.out.println(userCreateDto.getClass());
> >> > }
> >> >
> >> > }
> >> >
> >> >
> >> >
> >> > For some reason, the invocation handler defined for the proxy is
> never
> >> > invoked. Hence, the last System.out.println() simply prints `class
> >> > com.sun.proxy.$Proxy2`, but I would expect the `readValue` method to
> >> > fail
> >> > because of the intentional assertion error specified in the
> invocation
> >> > handler. My question is: what am I doing wrong and if it's possible
> to
> >> > make
> >> > Jackson work with dynamic proxies?
> >> >
> >> > Here are my Jackson dependencies:
> >> >
> >> > * com.fasterxml.jackson.core:jackson-core:2.6.3
> >> > * com.fasterxml.jackson.core:jackson-databind:2.6.3
> >>
> >> As usual, I would suggest trying out:
> >>
> >> 1. The last path version of minor version you have: 2.6.7; if same
> >> behavior
> >> 2. Try one of later maintained versions: either 2.8.11 or .29.6
> >>
> >> to verify issue still exists, as 2.6.3 is bit old version and there
> >> have been more fixes.
> >>
> >> Proxy types are not supported by default for deserialization, but
> >> custom deserializers should work I think.
> >> If later versions do not work (which seem likely), I would file an
> >> issue at github against `jackson-databind`.
> >>
> >> -+ Tatu +-
> >
> > --
> > You received this message because you are subscribed to the Google
> Groups
> > "jackson-user" group.
> > To unsubscribe from this group and stop receiving emails from it, send
> an
> > email to [email protected] <javascript:>.
> > To post to this group, send email to [email protected]
> <javascript:>.
> > For more options, visit https://groups.google.com/d/optout.
>
--
You received this message because you are subscribed to the Google Groups
"jackson-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/d/optout.