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.