defaultImpl helped. Thanks!

So, Animal.java has defaultImpl to itself.

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        defaultImpl = com.custom.model.Animal.class,
        include = JsonTypeInfo.As.PROPERTY,
        property = "@class"
)
@JsonSubTypes({
        @JsonSubTypes.Type(value = com.custom.model.Pet.class, name = 
"com.custom.model.Pet"),
        @JsonSubTypes.Type(value = com.custom.model.Dog.class, name = 
"com.custom.model.Dog"),
        @JsonSubTypes.Type(value = com.custom.model.Cat.class, name = 
"com.custom.model.Cat"),
        @JsonSubTypes.Type(value = com.custom.model.rabbit.class, name = 
"com.custom.model.rabbit"),
        @JsonSubTypes.Type(value = com.custom.abc.Pet1.class, name = 
"com.custom.abc.Pet1")
})

And the concrete child class has defaultImpl to itself.

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        defaultImpl = com.custom.model.Dog.class,
        include = JsonTypeInfo.As.PROPERTY,
        property = "@class"
)
But no @JsonSubTypes as it is a child class.

In this way, we are able to create objects with @class (for subtyping) and 
without @class (as in create object of itself) for both parent and child.




On Wednesday, April 10, 2019 at 12:55:19 AM UTC+5:30, Paulomi Mukherjee 
wrote:
>
> Hi All,
>
>
> If we add @JsonTypeInfo annotation to the parent class, is it mandatory 
> that the payload of both the parent class and child class should have 
> "<propertyName> (like @class for ID set as CLASS)" to explicitly specify 
> the class for which the object should be created? 
> Can it not work otherwise?
> Can I create a child object on the child endpoint without having the 
> <propertyName> in the payload?
>
> *Issue with example:*
>
> Animal class is parent of Dog class
>
> In Animal.java we have,
>
> @JsonTypeInfo(
>         use = JsonTypeInfo.Id.NAME,
>         include = JsonTypeInfo.As.PROPERTY,
>         property = "@class"
> )
> @JsonSubTypes({
>         @JsonSubTypes.Type(value = com.custom.model.Pet.class, name = 
> "com.custom.model.Pet"),
>         @JsonSubTypes.Type(value = com.custom.model.Dog.class, name = 
> "com.custom.model.Dog"),
>         @JsonSubTypes.Type(value = com.custom.model.Cat.class, name = "
> com.custom.model.Cat"),
>         @JsonSubTypes.Type(value = com.custom.model.rabbit.class, name = 
> "com.custom.model.rabbit")
> })
>
> And Dog.java has
>
> @JsonTypeName("com.custom.model.Dog")
>
> When we create a dog object from its own endpoint by performing post on 
> http://localhost:8080/api/dogs with payload
> {
>        "atr1":"value1"
> }
>
> I get the below error:
>
> 2019-04-08T15:39:46,443 DEBUG [qtp1639085390-18] o.s.c.l.LogFormatUtils: 
> POST "/api/dogs", parameters={}
> 2019-04-08T15:39:46,445 DEBUG [qtp1639085390-18] 
> o.s.w.s.h.AbstractHandlerMapping: Mapped to private java.util.List 
> com.custom.model.DogRestApiController.create(com.custom.model.Dog,javax.servlet.http.HttpServletRequest)
>  
> throws java.lang.Exception
> 2019-04-08T15:39:46,446 DEBUG [qtp1639085390-18] 
> o.s.d.n.w.s.OpenSessionInViewInterceptor: Opening Neo4j OGM Session in 
> OpenSessionInViewInterceptor
> 2019-04-08T15:39:46,450 DEBUG [qtp1639085390-18] 
> o.s.w.m.s.InvocableHandlerMethod: Could not resolve parameter [0] in 
> private java.util.List 
> com.custom.model.DogRestApiController.create(com.custom.model.Dog,javax.servlet.http.HttpServletRequest)
>  
> throws java.lang.Exception: JSON parse error: Missing type id when trying 
> to resolve subtype of [simple type, class com.custom.model.Dog]: missing 
> type id property '@class'; nested exception is 
> com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id 
> when trying to resolve subtype of [simple type, class 
> com.custom.model.Dog]: missing type id property '@class'
> at [Source: (PushbackInputStream); line: 4, column: 1]
> 2019-04-08T15:39:46,452 DEBUG [qtp1639085390-18] 
> o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver: Using @ExceptionHandler 
> public final org.springframework.http.ResponseEntity<java.lang.Object> 
> org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler.handleException(java.lang.Exception,org.springframework.web.context.request.WebRequest)
>  
> throws java.lang.Exception
> 2019-04-08T15:39:46,459 DEBUG [qtp1639085390-18] 
> o.s.w.s.m.m.a.AbstractMessageConverterMethodProcessor: No match for [*/*], 
> supported: []
> 2019-04-08T15:39:46,460 DEBUG [qtp1639085390-18] 
> o.s.w.s.h.AbstractHandlerExceptionResolver: Resolved 
> [org.springframework.http.converter.HttpMessageNotReadableException: JSON 
> parse error: Missing type id when trying to resolve subtype of [simple 
> type, class com.custom.model.Dog]: missing type id property '@class'; 
> nested exception is 
> com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id 
> when trying to resolve subtype of [simple type, class 
> com.custom.model.Dog]: missing type id property '@class'
> at [Source: (PushbackInputStream); line: 4, column: 1]]
> 2019-04-08T15:39:46,461 DEBUG [qtp1639085390-18] 
> o.s.d.n.w.s.OpenSessionInViewInterceptor: Closed Neo4j OGM Session in 
> OpenSessionInViewInterceptor
> 2019-04-08T15:39:46,461 DEBUG [qtp1639085390-18] o.s.w.s.FrameworkServlet: 
> Completed 400 BAD_REQUEST
>
> This exception is caught in spring webmvc. Spring boot version is 2.1.3.
> The control does not reach the custom controller code (the postMapping 
> code) as spring webmvc expects the property name @class from @JsonTypeInfo.
>
>

-- 
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.

Reply via email to