-
Notifications
You must be signed in to change notification settings - Fork 59
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Use JsonValue method type when present. #449
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,65 @@ | ||||||||||||||||||||||||||||||||||||||
/* | ||||||||||||||||||||||||||||||||||||||
* Copyright 2020 VicTools. | ||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||||||||||||||||||||||||||||||||||||||
* you may not use this file except in compliance with the License. | ||||||||||||||||||||||||||||||||||||||
* You may obtain a copy of the License at | ||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||
* http://www.apache.org/licenses/LICENSE-2.0 | ||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||
* Unless required by applicable law or agreed to in writing, software | ||||||||||||||||||||||||||||||||||||||
* distributed under the License is distributed on an "AS IS" BASIS, | ||||||||||||||||||||||||||||||||||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||||||||||||||||||||||||||||||||||
* See the License for the specific language governing permissions and | ||||||||||||||||||||||||||||||||||||||
* limitations under the License. | ||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
package com.github.victools.jsonschema.module.jackson; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
import com.fasterxml.classmate.ResolvedType; | ||||||||||||||||||||||||||||||||||||||
import com.fasterxml.classmate.members.ResolvedMethod; | ||||||||||||||||||||||||||||||||||||||
import com.fasterxml.jackson.annotation.JsonValue; | ||||||||||||||||||||||||||||||||||||||
import com.github.victools.jsonschema.generator.CustomDefinition; | ||||||||||||||||||||||||||||||||||||||
import com.github.victools.jsonschema.generator.CustomDefinitionProviderV2; | ||||||||||||||||||||||||||||||||||||||
import com.github.victools.jsonschema.generator.SchemaGenerationContext; | ||||||||||||||||||||||||||||||||||||||
import java.util.Optional; | ||||||||||||||||||||||||||||||||||||||
import java.util.Set; | ||||||||||||||||||||||||||||||||||||||
import java.util.stream.Collectors; | ||||||||||||||||||||||||||||||||||||||
import java.util.stream.Stream; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||
* Implementation of the {@link CustomDefinitionProviderV2} interface for treating object types based on a {@link JsonValue} annotation | ||||||||||||||||||||||||||||||||||||||
* being present with {@code value = true} on exactly one argument-free method. If no such annotations exist, no custom definition will be returned; | ||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. typo
Suggested change
|
||||||||||||||||||||||||||||||||||||||
* thereby falling back on whatever is defined in a following custom definition (e.g. from one of the standard generator {@code Option}s). | ||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||
public class JsonValueDefinitionProvider implements CustomDefinitionProviderV2 { | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
@Override | ||||||||||||||||||||||||||||||||||||||
public CustomDefinition provideCustomSchemaDefinition(ResolvedType javaType, SchemaGenerationContext context) { | ||||||||||||||||||||||||||||||||||||||
ResolvedMethod jsonValueAnnotatedMethod = getJsonValueAnnotatedMethod(javaType, context); | ||||||||||||||||||||||||||||||||||||||
if (jsonValueAnnotatedMethod == null) { | ||||||||||||||||||||||||||||||||||||||
return null; | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
return new CustomDefinition(context.createDefinition(jsonValueAnnotatedMethod.getType())); | ||||||||||||||||||||||||||||||||||||||
Comment on lines
+35
to
+43
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. suggestion: A custom definition provider by design should be the last resort when realizing some requirement.
Suggested change
|
||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||
* Look-up the single {@link JsonValue} annotated method with {@code value = true} and no expected arguments. | ||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||
* @param javaType targeted type to look-up serialization method for | ||||||||||||||||||||||||||||||||||||||
* @param context generation context providing access to type resolution context | ||||||||||||||||||||||||||||||||||||||
* @return single method with {@link JsonValue} annotation | ||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||
protected ResolvedMethod getJsonValueAnnotatedMethod(ResolvedType javaType, SchemaGenerationContext context) { | ||||||||||||||||||||||||||||||||||||||
ResolvedMethod[] memberMethods = context.getTypeContext().resolveWithMembers(javaType).getMemberMethods(); | ||||||||||||||||||||||||||||||||||||||
Set<ResolvedMethod> jsonValueAnnotatedMethods = Stream.of(memberMethods) | ||||||||||||||||||||||||||||||||||||||
.filter(method -> method.getArgumentCount() == 0) | ||||||||||||||||||||||||||||||||||||||
.filter(method -> Optional.ofNullable(method.getAnnotations().get(JsonValue.class)).map(JsonValue::value).orElse(false)) | ||||||||||||||||||||||||||||||||||||||
.collect(Collectors.toSet()); | ||||||||||||||||||||||||||||||||||||||
if (jsonValueAnnotatedMethods.size() == 1) { | ||||||||||||||||||||||||||||||||||||||
return jsonValueAnnotatedMethods.iterator().next(); | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
return null; | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -95,6 +95,8 @@ static class TestClass { | |||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
public TestEnumWithJsonPropertyAnnotations enumValueWithJsonPropertyAnnotations; | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
public TestTypeWithJsonValue typeWithJsonValue; | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
public BaseType interfaceWithDeclaredSubtypes; | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
@JsonUnwrapped | ||||||||||||||||||||||||||||||
|
@@ -131,6 +133,15 @@ enum TestEnumWithJsonPropertyAnnotations { | |||||||||||||||||||||||||||||
@JsonProperty Y | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
static class TestTypeWithJsonValue { | ||||||||||||||||||||||||||||||
String value; | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
@JsonValue | ||||||||||||||||||||||||||||||
String getJsonValue() { | ||||||||||||||||||||||||||||||
return value; | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
Comment on lines
+136
to
+142
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. suggestion: Let's also consider generic type parameters here. public TestTypeWithJsonValue<String> typeWithJsonValue;
Suggested change
For that to be respected, we'd also need to consider fields and methods explicitly (as only there, the necessary type parameter may be defined) – on top of the one for the type in general. |
||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") | ||||||||||||||||||||||||||||||
static class TestTypeWithObjectId { | ||||||||||||||||||||||||||||||
IdType id; | ||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nitpick: Time traveler 😉