Description
I would like to be able to customize how Spring for GraphQL instantiates objects from query/mutation arguments. Example schema:
input type Parent1 {
child: Child
}
input type Parent2 {
child: Child
}
input type Child {
prop1: Int
prop2: Int
}
type Query {
createParent1(parent: Parent1): Parent1
createParent2(parent: Parent2): Parent2
}
I have the corresponding controller methods which follow the standard naming convention and whose arguments are classes Parent1
and Parent2
, respectively. These parent classes' structure is the same as the input types but Child
class has a different structure than the corresponding input type (e.g. input prop1
is used as an argument to a function that populates target prop3
). I would like to be able to define a custom deserializer of the Child
class from the internal argument submap.
Currently, I'm achieving this manually, i.e. my controller method looks like this:
@MutationMapping
fun createParent1(@Argument parent: Map<String, Any>) {
val parentTransformed = parent.findAndTransformNestedChild()
return mapper.convertValue(parentTransformed, Parent1::class.java)
}
This works but must be repeated for each mutation/parent combination.
Is there a better way how to achieve my use case? I've initially also explored a way to define an input object directive but I couldn't figure out whether/how an input data transformer can be set there.