On Sat, May 16, 2020 at 12:41 AM maxxyme <[email protected]> wrote:
>
> Sorry to jump into the conversation, but wasn't it what he has been doing in 
> his User class already?
> (using ObjectIdGenerators.PropertyGenerator in his JsonIdentityInfo 
> definition)
>
> Thanks for any explanation.
> maxxyme

No problem at all jumping to help. Looking at code now, you are right:
PropertyGenerator is being used.
Earlier I thought I saw it use `IntSequenceGenerator`, which would not
have worked.

So that part of my suggestion was misleading.

Object Id being encapsulated with Type Id would have been problematic,
either way, although I am not
sure what the remaining problem then would be.

-+ Tatu +-

>
> On Sat, May 16, 2020, 06:07 Tatu Saloranta <[email protected]> wrote:
>>
>> On Thu, May 14, 2020 at 7:38 AM Alex T <[email protected]> wrote:
>>>
>>> Hi Tatu!
>>>
>>> For now I solve issue changing from mapper.activateDefaultTyping(ptv, 
>>> ObjectMapper.DefaultTyping.EVERYTHING); to
>>> mapper.activateDefaultTyping(ptv, ObjectMapper.DefaultTyping.NON_FINAL);
>>>
>>> Please see 
>>> https://github.com/alex-t0/deserialization-fail-example/commit/5c1e9f73a21567c04823145993ffd09c314a276e#diff-590456d68d9f15ce57513829910aa370.
>>>
>>> Now it does not wrap user id. And deserialization works fine.
>>
>>
>> That makes sense. Actually having Type Id for `Long` is fine in itself, but 
>> it would not have worked as type id most likely. And there can not be any 
>> polymorphism anyway in that location.
>>
>>> But I'm not understand what you mean about @JsonIgnore'ing or removing my 
>>> id field. It is a primary key and I need this field. If I add @JsonIgnore 
>>> to id field I get this error:
>>
>>
>> What I mean is that combination of settings you had was incompatible. You 
>> need to either:
>>
>> 1. Let Jackson generate Object Id by itself and NOT have id field in your 
>> POJO, OR
>> 2. Use an existing field as Object Id and make sure Jackson uses that field 
>> and does NOT generate Object id.
>>
>> For second, I already said that...
>>
>> "For using fields, you'd need to use  `ObjectIdGenerators.PropertyGenerator`"
>>
>> so change generator type to that, from what you had.
>>
>> -+ Tatu +-
>>
>>
>>>
>>>
>>> Caused by: java.lang.IllegalArgumentException: Invalid Object Id definition 
>>> for deserialization.fail.example.User: cannot find property with name 'id'
>>>     at 
>>> com.fasterxml.jackson.databind.ser.BeanSerializerFactory.constructObjectIdHandler(BeanSerializerFactory.java:491)
>>>     at 
>>> com.fasterxml.jackson.databind.ser.BeanSerializerFactory.constructBeanOrAddOnSerializer(BeanSerializerFactory.java:414)
>>>     at 
>>> com.fasterxml.jackson.databind.ser.BeanSerializerFactory.findBeanOrAddOnSerializer(BeanSerializerFactory.java:286)
>>>     at 
>>> com.fasterxml.jackson.databind.ser.BeanSerializerFactory._createSerializer2(BeanSerializerFactory.java:231)
>>>     at 
>>> com.fasterxml.jackson.databind.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:165)
>>>     at 
>>> com.fasterxml.jackson.databind.SerializerProvider._createUntypedSerializer(SerializerProvider.java:1474)
>>>     at 
>>> com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:1422)
>>>     ... 100 more
>>>
>>> PS. Can you reemove my second duplicate thread 
>>> https://groups.google.com/forum/#!topic/jackson-user/MK8RLm8Unu0?
>>>
>>> On Tuesday, May 12, 2020 at 2:07:55 AM UTC+3, Tatu Saloranta wrote:
>>>>
>>>> On Mon, May 11, 2020 at 9:52 AM Alex T <[email protected]> wrote:
>>>> >
>>>> > Hi everyone!
>>>> >
>>>> > When serializing entity with many references to another same entity, if 
>>>> > that entity marked @JsonIdentityInfo, first occurence of entity 
>>>> > serialized as full entity, other occurrences are serialized as id. Its 
>>>> > work.
>>>> > I need to serialize entities with type information, so I use polymorphic 
>>>> > type handler.
>>>> >
>>>> > I created test project: 
>>>> > https://github.com/alex-t0/deserialization-fail-example.git
>>>> >
>>>> > Please see this classes:
>>>> >
>>>> > User - 
>>>> > https://github.com/alex-t0/deserialization-fail-example/blob/master/src/main/java/deserialization/fail/example/User.java
>>>> > UserPair - 
>>>> > https://github.com/alex-t0/deserialization-fail-example/blob/master/src/main/java/deserialization/fail/example/UserPair.java
>>>> > MapperUtil - 
>>>> > https://github.com/alex-t0/deserialization-fail-example/blob/master/src/main/java/deserialization/fail/example/MapperUtil.java
>>>> > UserSerializationTest - 
>>>> > https://github.com/alex-t0/deserialization-fail-example/blob/master/src/test/java/deserialization/fail/example/UserSerializationTest.java
>>>> >
>>>> > Serialization works as I expect:
>>>> >
>>>> > [
>>>> >     "deserialization.fail.example.UserPair",
>>>> >     {
>>>> >         "user1": [
>>>> >             "deserialization.fail.example.User",
>>>> >             {
>>>> >                 "id": [
>>>> >                     "java.lang.Long",
>>>> >                     42
>>>> >                 ],
>>>>
>>>>                    ^^^^^^^^^
>>>>
>>>> This is wrong. Id should be plain number (`42`) and suggests the most
>>>> likely problem.
>>>> It should never be wrapped in type information (in fact, not even
>>>> normal `long`/`Long` properties, being
>>>> one of small number of "natural" types).
>>>>
>>>> Definition JsonIdentityInfo info is the problem in this case:
>>>>
>>>> @JsonIdentityInfo(
>>>>         generator = ObjectIdGenerators.PropertyGenerator.class,
>>>>         property = "id",
>>>>         scope = User.class
>>>> )
>>>>
>>>> ... because you are trying to use an actual physical field (`private
>>>> long Id`), but this definition would
>>>> try to generate new value and assumes there is no "real" field.
>>>> For using fields, you'd need to use
>>>> `ObjectIdGenerators.PropertyGenerator` (but then id must be populated
>>>> by your code).
>>>>
>>>> Alternatively you should either just remove the field (if not needed),
>>>> or, if needed for Hibernate or such,
>>>> add `@JsonIgnore` on it.
>>>> But assuming this Id value comes from DB (sequence?), the first option
>>>> is probably what you want.
>>>>
>>>> Combination of Hibernate module and JSON Identity might cause other
>>>> issues as well, since unfortunately Hibernate module
>>>> is not maintained and its support for Proxy types seems to cause
>>>> problems with some Jackson features.
>>>> Another possibility just for testing might be to try to not register
>>>> that module, just to isolate problematic component.
>>>>
>>>> I hope this helps,
>>>>
>>>> -+ 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].
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/jackson-user/52f9385a-3185-439d-a1f0-c1f881587bfc%40googlegroups.com.
>>
>> --
>> 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 view this discussion on the web visit 
>> https://groups.google.com/d/msgid/jackson-user/CAGrxA27a8GjJ6mgybdJTYcNqYpbJ38%3Daa7uYgOrgBVtWBD75MA%40mail.gmail.com.
>
> --
> 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 view this discussion on the web visit 
> https://groups.google.com/d/msgid/jackson-user/CAEEu3mBTO7X0PomkYEfAWiXGsFxchuHu3kpX%3Dy8BjiCxSZJ71A%40mail.gmail.com.

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/jackson-user/CAL4a10j93w_5B8BJ7RFJo%3DO4PkjijCVzYJrM0ajGmc56a8c%2BHQ%40mail.gmail.com.

Reply via email to