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.