Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
梦境迷离
Graphql Java Codegen
提交
c8df4854
G
Graphql Java Codegen
项目概览
梦境迷离
/
Graphql Java Codegen
11 个月 前同步成功
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
Graphql Java Codegen
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
c8df4854
编写于
2月 24, 2021
作者:
B
Bogdan Kobylynskyi
提交者:
GitHub
2月 24, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix a case when field is non-null in type and nullable in interface #556 (#557)
上级
8c46e67c
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
234 addition
and
82 deletion
+234
-82
src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionToParameterMapper.java
...phql/codegen/mapper/FieldDefinitionToParameterMapper.java
+1
-0
src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionsToResolverDataModelMapper.java
...gen/mapper/FieldDefinitionsToResolverDataModelMapper.java
+16
-3
src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputValueDefinitionToParameterMapper.java
...codegen/mapper/InputValueDefinitionToParameterMapper.java
+1
-0
src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java
...aphql/codegen/mapper/TypeDefinitionToDataModelMapper.java
+17
-1
src/main/java/com/kobylynskyi/graphql/codegen/model/ParameterDefinition.java
...obylynskyi/graphql/codegen/model/ParameterDefinition.java
+23
-12
src/main/resources/templates/java-lang/javaClassGraphqlType.ftl
...in/resources/templates/java-lang/javaClassGraphqlType.ftl
+65
-65
src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java
...bylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java
+23
-1
src/test/resources/expected-classes/optional/InterfaceWithOptionalField.java.txt
...cted-classes/optional/InterfaceWithOptionalField.java.txt
+9
-0
src/test/resources/expected-classes/optional/TypeWithMandatoryField.java.txt
...expected-classes/optional/TypeWithMandatoryField.java.txt
+72
-0
src/test/resources/schemas/optional-vs-mandatory-types.graphqls
...st/resources/schemas/optional-vs-mandatory-types.graphqls
+7
-0
未找到文件。
src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionToParameterMapper.java
浏览文件 @
c8df4854
...
...
@@ -121,6 +121,7 @@ public class FieldDefinitionToParameterMapper {
parameter
.
setAnnotations
(
graphQLTypeMapper
.
getAnnotations
(
mappingContext
,
fieldDef
.
getType
(),
fieldDef
,
parentTypeName
,
false
));
parameter
.
setJavaDoc
(
fieldDef
.
getJavaDoc
());
parameter
.
setDeprecated
(
fieldDef
.
getDeprecated
(
mappingContext
));
parameter
.
setMandatory
(
namedDefinition
.
isMandatory
());
parameter
.
setSerializeUsingObjectMapper
(
namedDefinition
.
isSerializeUsingObjectMapper
());
return
parameter
;
}
...
...
src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionsToResolverDataModelMapper.java
浏览文件 @
c8df4854
...
...
@@ -22,9 +22,17 @@ import java.util.Map;
import
java.util.Set
;
import
java.util.stream.Collectors
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.*;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
CLASS_NAME
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
ENUM_IMPORT_IT_SELF_IN_SCALA
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
GENERATED_ANNOTATION
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
GENERATED_INFO
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
GENERATE_MODEL_OPEN_CLASSES
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
IMPLEMENTS
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
IMPORTS
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
JAVA_DOC
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
OPERATIONS
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
PACKAGE
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
MappingConfigConstants
.
PARENT_INTERFACE_TYPE_PLACEHOLDER
;
import
static
java
.
util
.
Collections
.
emptyList
;
import
static
java
.
util
.
Collections
.
singletonList
;
/**
...
...
@@ -197,7 +205,12 @@ public class FieldDefinitionsToResolverDataModelMapper {
if
(!
Utils
.
isGraphqlOperation
(
parentTypeName
))
{
String
parentObjectParamType
=
graphQLTypeMapper
.
getLanguageType
(
mappingContext
,
new
TypeName
(
parentTypeName
));
String
parentObjectParamName
=
dataModelMapper
.
capitalizeIfRestricted
(
mappingContext
,
Utils
.
uncapitalize
(
parentObjectParamType
));
parameters
.
add
(
new
ParameterDefinition
(
parentObjectParamType
,
parentObjectParamName
,
parentObjectParamName
,
null
,
emptyList
(),
emptyList
(),
resolvedField
.
getDeprecated
(
mappingContext
),
false
));
ParameterDefinition
parameterDefinition
=
new
ParameterDefinition
();
parameterDefinition
.
setType
(
parentObjectParamType
);
parameterDefinition
.
setName
(
parentObjectParamName
);
parameterDefinition
.
setOriginalName
(
parentObjectParamName
);
parameterDefinition
.
setDeprecated
(
resolvedField
.
getDeprecated
(
mappingContext
));
parameters
.
add
(
parameterDefinition
);
}
// 2. Next parameters are input values
...
...
src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputValueDefinitionToParameterMapper.java
浏览文件 @
c8df4854
...
...
@@ -60,6 +60,7 @@ public class InputValueDefinitionToParameterMapper {
parameter
.
setDefaultValue
(
valueMapper
.
map
(
mappingContext
,
inputValueDefinition
.
getDefaultValue
(),
inputValueDefinition
.
getType
()));
parameter
.
setAnnotations
(
graphQLTypeMapper
.
getAnnotations
(
mappingContext
,
inputValueDefinition
.
getType
(),
inputValueDefinition
,
parentTypeName
,
false
));
parameter
.
setDeprecated
(
graphQLTypeMapper
.
getDeprecated
(
mappingContext
,
inputValueDefinition
));
parameter
.
setMandatory
(
namedDefinition
.
isMandatory
());
parameter
.
setSerializeUsingObjectMapper
(
namedDefinition
.
isSerializeUsingObjectMapper
());
return
parameter
;
}
...
...
src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java
浏览文件 @
c8df4854
...
...
@@ -16,7 +16,22 @@ import java.util.Map;
import
java.util.Set
;
import
java.util.stream.Collectors
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.*;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
ANNOTATIONS
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
BUILDER
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
CLASS_NAME
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
ENUM_IMPORT_IT_SELF_IN_SCALA
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
EQUALS_AND_HASH_CODE
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
FIELDS
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
GENERATED_ANNOTATION
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
GENERATED_INFO
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
GENERATE_MODEL_OPEN_CLASSES
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
IMMUTABLE_MODELS
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
IMPLEMENTS
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
JAVA_DOC
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
PACKAGE
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
PARENT_INTERFACE_PROPERTIES
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
TO_STRING
;
import
static
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
DataModelFields
.
TO_STRING_FOR_REQUEST
;
/**
* Map type definition to a Freemarker data model
...
...
@@ -46,6 +61,7 @@ public class TypeDefinitionToDataModelMapper {
* @return merged parameter definition
*/
private
static
ParameterDefinition
merge
(
ParameterDefinition
typeDef
,
ParameterDefinition
interfaceDef
)
{
typeDef
.
setDefinitionInParentType
(
interfaceDef
);
if
(
Utils
.
isEmpty
(
typeDef
.
getAnnotations
()))
{
typeDef
.
setAnnotations
(
interfaceDef
.
getAnnotations
());
}
...
...
src/main/java/com/kobylynskyi/graphql/codegen/model/ParameterDefinition.java
浏览文件 @
c8df4854
...
...
@@ -6,8 +6,6 @@ import graphql.schema.DataFetchingEnvironment;
import
java.util.ArrayList
;
import
java.util.List
;
import
static
java
.
util
.
Collections
.
emptyList
;
/**
* Freemarker-understandable format of method parameter and field definition
*
...
...
@@ -16,7 +14,7 @@ import static java.util.Collections.emptyList;
public
class
ParameterDefinition
{
public
static
final
ParameterDefinition
DATA_FETCHING_ENVIRONMENT
=
new
ParameterDefinition
(
DataFetchingEnvironment
.
class
.
getName
(),
"env"
,
"env"
,
null
,
emptyList
(),
emptyList
(),
null
,
false
);
DataFetchingEnvironment
.
class
.
getName
(),
"env"
);
private
String
type
;
/**
...
...
@@ -28,25 +26,23 @@ public class ParameterDefinition {
*/
private
String
originalName
;
private
String
defaultValue
;
private
boolean
isMandatory
;
private
List
<
String
>
annotations
=
new
ArrayList
<>();
private
List
<
String
>
javaDoc
=
new
ArrayList
<>();
private
DeprecatedDefinition
deprecated
;
private
boolean
serializeUsingObjectMapper
;
/**
* Definition of the same type, but defined in the parent
*/
private
ParameterDefinition
definitionInParentType
;
public
ParameterDefinition
()
{
}
public
ParameterDefinition
(
String
type
,
String
name
,
String
originalName
,
String
defaultValue
,
List
<
String
>
annotations
,
List
<
String
>
javaDoc
,
DeprecatedDefinition
deprecated
,
boolean
serializeUsingObjectMapper
)
{
private
ParameterDefinition
(
String
type
,
String
name
)
{
this
.
type
=
type
;
this
.
name
=
name
;
this
.
originalName
=
originalName
;
this
.
defaultValue
=
defaultValue
;
this
.
annotations
=
annotations
;
this
.
javaDoc
=
javaDoc
;
this
.
deprecated
=
deprecated
;
this
.
serializeUsingObjectMapper
=
serializeUsingObjectMapper
;
this
.
originalName
=
name
;
}
public
String
getType
()
{
...
...
@@ -81,6 +77,14 @@ public class ParameterDefinition {
this
.
defaultValue
=
defaultValue
;
}
public
boolean
isMandatory
()
{
return
isMandatory
;
}
public
void
setMandatory
(
boolean
mandatory
)
{
isMandatory
=
mandatory
;
}
public
List
<
String
>
getAnnotations
()
{
return
annotations
;
}
...
...
@@ -113,4 +117,11 @@ public class ParameterDefinition {
this
.
serializeUsingObjectMapper
=
serializeUsingObjectMapper
;
}
public
void
setDefinitionInParentType
(
ParameterDefinition
definitionInParentType
)
{
this
.
definitionInParentType
=
definitionInParentType
;
}
public
ParameterDefinition
getDefinitionInParentType
()
{
return
definitionInParentType
;
}
}
src/main/resources/templates/java-lang/javaClassGraphqlType.ftl
浏览文件 @
c8df4854
...
...
@@ -4,9 +4,9 @@ package ${package};
</#
if
>
<#
if
imports
??>
<#
list
imports
as
import
>
<#
list
imports
as
import
>
import
${
import
}.*;
</#
list
>
</#
list
>
</#
if
>
<#
if
toStringForRequest
>
import
com
.
kobylynskyi
.
graphql
.
codegen
.
model
.
graphql
.
GraphQLRequestSerializer
;
...
...
@@ -20,9 +20,9 @@ import java.util.StringJoiner;
<#
if
javaDoc
?
has_content
>
/**
<#
list
javaDoc
as
javaDocLine
>
<#
list
javaDoc
as
javaDocLine
>
*
${
javaDocLine
}
</#
list
>
</#
list
>
*/
</#
if
>
<#
if
generatedAnnotation
&&
generatedInfo
.
getGeneratedType
()?
has_content
>
...
...
@@ -37,15 +37,15 @@ import java.util.StringJoiner;
public
class
${
className
}
implements
java
.
io
.
Serializable
<#
if
implements
?
has_content
><#
list
implements
as
interface
>,
${
interface
}<#
if
interface_has_next
></#
if
></#
list
></#
if
>
{
<#
if
fields
?
has_content
>
<#
list
fields
as
field
>
<#
if
field
.
deprecated
?
has_content
>
<#
list
fields
as
field
>
<#
if
field
.
deprecated
?
has_content
>
@${
field
.
deprecated
.
annotation
}
</#
if
>
<#
list
field
.
annotations
as
annotation
>
</#
if
>
<#
list
field
.
annotations
as
annotation
>
@${
annotation
}
</#
list
>
</#
list
>
private
${
field
.
type
}
${
field
.
name
}<#
if
field
.
defaultValue
?
has_content
>
=
${
field
.
defaultValue
}</#
if
>;
</#
list
>
</#
list
>
</#
if
>
public
${
className
}()
{
...
...
@@ -53,44 +53,44 @@ public class ${className} implements java.io.Serializable<#if implements?has_con
<#
if
fields
?
has_content
>
public
${
className
}(<#
list
fields
as
field
>${
field
.
type
}
${
field
.
name
}<#
if
field_has_next
>,
</#
if
></#
list
>)
{
<#
list
fields
as
field
>
<#
list
fields
as
field
>
this
.${
field
.
name
}
=
${
field
.
name
};
</#
list
>
</#
list
>
}
</#
if
>
<#
if
fields
?
has_content
>
<#
list
fields
as
field
>
<#
if
field
.
javaDoc
?
has_content
>
<#
list
fields
as
field
>
<#
if
field
.
javaDoc
?
has_content
>
/**
<#
list
field
.
javaDoc
as
javaDocLine
>
<#
list
field
.
javaDoc
as
javaDocLine
>
*
${
javaDocLine
}
</#
list
>
</#
list
>
*/
</#
if
>
<#
if
field
.
deprecated
?
has_content
>
</#
if
>
<#
if
field
.
deprecated
?
has_content
>
@${
field
.
deprecated
.
annotation
}
</#
if
>
public
${
field
.
type
}
get
${
field
.
name
?
cap_first
}()
{
</#
if
>
public
<#
if
field
.
mandatory
&&
field
.
definitionInParentType
?
has_content
&&
!field.definitionInParentType.mandatory>${field.definitionInParentType.type}<#else>${field.type}</#if>
get${field.name?cap_first}() {
return
${
field
.
name
};
}
<#
if
!immutableModels>
<#
if
field
.
javaDoc
?
has_content
>
<#
if
!immutableModels>
<#
if
field
.
javaDoc
?
has_content
>
/**
<#
list
field
.
javaDoc
as
javaDocLine
>
<#
list
field
.
javaDoc
as
javaDocLine
>
*
${
javaDocLine
}
</#
list
>
</#
list
>
*/
</#
if
>
<#
if
field
.
deprecated
?
has_content
>
</#
if
>
<#
if
field
.
deprecated
?
has_content
>
@${
field
.
deprecated
.
annotation
}
</#
if
>
</#
if
>
public
void
set
${
field
.
name
?
cap_first
}(${
field
.
type
}
${
field
.
name
})
{
this
.${
field
.
name
}
=
${
field
.
name
};
}
</#
if
>
</#
if
>
</#
list
>
</#
list
>
</#
if
>
<#
if
equalsAndHashCode
>
@
Override
...
...
@@ -102,21 +102,21 @@ public class ${className} implements java.io.Serializable<#if implements?has_con
return
false
;
}
final
${
className
}
that
=
(${
className
})
obj
;
<#
if
fields
?
has_content
>
<#
if
fields
?
has_content
>
return
<#
list
fields
as
field
>
Objects
.
equals
(${
field
.
name
},
that
.${
field
.
name
})<#
if
field_has_next
>
&&
</#
if
></#
list
>;
<#
else
>
<#
else
>
return
true
;
</#
if
>
</#
if
>
}
@
Override
public
int
hashCode
()
{
<#
if
fields
?
has_content
>
<#
if
fields
?
has_content
>
return
Objects
.
hash
(<#
list
fields
as
field
>${
field
.
name
}<#
if
field_has_next
>,
</#
if
></#
list
>);
<#
else
>
<#
else
>
return
0
;
</#
if
>
</#
if
>
}
</#
if
>
...
...
@@ -124,29 +124,29 @@ public class ${className} implements java.io.Serializable<#if implements?has_con
@
Override
public
String
toString
()
{
StringJoiner
joiner
=
new
StringJoiner
(
", "
,
"{ "
,
" }"
);
<#
if
fields
?
has_content
>
<#
list
fields
as
field
>
<#
if
MapperUtil
.
isJavaPrimitive
(
field
.
type
)>
<#
if
toStringForRequest
>
<#
if
fields
?
has_content
>
<#
list
fields
as
field
>
<#
if
MapperUtil
.
isJavaPrimitive
(
field
.
type
)>
<#
if
toStringForRequest
>
joiner
.
add
(
"${field.originalName}: "
+
GraphQLRequestSerializer
.
getEntry
(${
field
.
name
}<#
if
field
.
serializeUsingObjectMapper
>,
true
</#
if
>));
<#
else
>
<#
else
>
joiner
.
add
(
"${field.originalName}: "
+
${
field
.
name
});
</#
if
>
<#
else
>
</#
if
>
<#
else
>
if
(${
field
.
name
}
!= null) {
<#
if
toStringForRequest
>
<#
if
toStringForRequest
>
joiner
.
add
(
"${field.originalName}: "
+
GraphQLRequestSerializer
.
getEntry
(${
field
.
name
}<#
if
field
.
serializeUsingObjectMapper
>,
true
</#
if
>));
<#
else
>
<#
if
field
.
type
==
"String"
>
<#
else
>
<#
if
field
.
type
==
"String"
>
joiner
.
add
(
"${field.originalName}:
\"
"
+
${
field
.
name
}
+
"
\"
"
);
<#
else
>
<#
else
>
joiner
.
add
(
"${field.originalName}: "
+
${
field
.
name
});
</#
if
>
</#
if
>
</#
if
>
</#
if
>
}
</#
if
>
</#
list
>
</#
if
>
</#
if
>
</#
list
>
</#
if
>
return
joiner
.
toString
();
}
</#
if
>
...
...
@@ -158,34 +158,34 @@ public class ${className} implements java.io.Serializable<#if implements?has_con
public
static
class
Builder
{
<#
if
fields
?
has_content
>
<#
list
fields
as
field
>
<#
if
fields
?
has_content
>
<#
list
fields
as
field
>
private
${
field
.
type
}
${
field
.
name
}<#
if
field
.
defaultValue
?
has_content
>
=
${
field
.
defaultValue
}</#
if
>;
</#
list
>
</#
if
>
</#
list
>
</#
if
>
public
Builder
()
{
}
<#
if
fields
?
has_content
>
<#
list
fields
as
field
>
<#
if
field
.
javaDoc
?
has_content
>
<#
if
fields
?
has_content
>
<#
list
fields
as
field
>
<#
if
field
.
javaDoc
?
has_content
>
/**
<#
list
field
.
javaDoc
as
javaDocLine
>
<#
list
field
.
javaDoc
as
javaDocLine
>
*
${
javaDocLine
}
</#
list
>
</#
list
>
*/
</#
if
>
<#
if
field
.
deprecated
?
has_content
>
</#
if
>
<#
if
field
.
deprecated
?
has_content
>
@${
field
.
deprecated
.
annotation
}
</#
if
>
</#
if
>
public
Builder
set
${
field
.
name
?
cap_first
}(${
field
.
type
}
${
field
.
name
})
{
this
.${
field
.
name
}
=
${
field
.
name
};
return
this
;
}
</#
list
>
</#
if
>
</#
list
>
</#
if
>
public
${
className
}
build
()
{
return
new
${
className
}(<#
list
fields
as
field
>${
field
.
name
}<#
if
field_has_next
>,
</#
if
></#
list
>);
...
...
src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java
浏览文件 @
c8df4854
...
...
@@ -24,7 +24,6 @@ class GraphQLCodegenOptionalTest {
@BeforeEach
void
before
()
{
schemaFinder
.
setIncludePattern
(
"github.*\\.graphqls"
);
mappingConfig
.
setUseOptionalForNullableReturnTypes
(
true
);
}
...
...
@@ -35,6 +34,7 @@ class GraphQLCodegenOptionalTest {
@Test
void
generate_Optional
()
throws
Exception
{
schemaFinder
.
setIncludePattern
(
"github.*\\.graphqls"
);
new
JavaGraphQLCodegen
(
schemaFinder
.
findSchemas
(),
outputBuildDir
,
mappingConfig
,
TestUtils
.
getStaticGeneratedInfo
())
.
generate
();
...
...
@@ -59,6 +59,7 @@ class GraphQLCodegenOptionalTest {
@Test
void
generate_OptionalWithCustomApiReturnType
()
throws
Exception
{
schemaFinder
.
setIncludePattern
(
"github.*\\.graphqls"
);
mappingConfig
.
setApiReturnType
(
"reactor.core.publisher.Mono"
);
mappingConfig
.
setApiReturnListType
(
"reactor.core.publisher.Flux"
);
...
...
@@ -72,4 +73,25 @@ class GraphQLCodegenOptionalTest {
getFileByName
(
files
,
"NodeQueryResolver.java"
));
}
/**
* @see <a href="https://github.com/kobylynskyi/graphql-java-codegen/issues/556">Related issue in GitHub</a>
*/
@Test
void
generate_OptionalFieldInInterfaceAndMandatoryInType
()
throws
Exception
{
mappingConfig
.
setGenerateBuilder
(
true
);
mappingConfig
.
setGenerateToString
(
true
);
mappingConfig
.
setGenerateEqualsAndHashCode
(
true
);
schemaFinder
.
setIncludePattern
(
"optional-vs-mandatory-types.graphqls"
);
new
JavaGraphQLCodegen
(
schemaFinder
.
findSchemas
(),
outputBuildDir
,
mappingConfig
,
TestUtils
.
getStaticGeneratedInfo
())
.
generate
();
File
[]
files
=
Objects
.
requireNonNull
(
outputJavaClassesDir
.
listFiles
());
assertSameTrimmedContent
(
new
File
(
"src/test/resources/expected-classes/optional/InterfaceWithOptionalField.java.txt"
),
getFileByName
(
files
,
"InterfaceWithOptionalField.java"
));
assertSameTrimmedContent
(
new
File
(
"src/test/resources/expected-classes/optional/TypeWithMandatoryField.java.txt"
),
getFileByName
(
files
,
"TypeWithMandatoryField.java"
));
}
}
\ No newline at end of file
src/test/resources/expected-classes/optional/InterfaceWithOptionalField.java.txt
0 → 100644
浏览文件 @
c8df4854
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
)
public interface InterfaceWithOptionalField {
Integer getTest();
}
\ No newline at end of file
src/test/resources/expected-classes/optional/TypeWithMandatoryField.java.txt
0 → 100644
浏览文件 @
c8df4854
import java.util.Objects;
import java.util.StringJoiner;
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
)
public class TypeWithMandatoryField implements java.io.Serializable, InterfaceWithOptionalField {
private int test;
public TypeWithMandatoryField() {
}
public TypeWithMandatoryField(int test) {
this.test = test;
}
public Integer getTest() {
return test;
}
public void setTest(int test) {
this.test = test;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
final TypeWithMandatoryField that = (TypeWithMandatoryField) obj;
return Objects.equals(test, that.test);
}
@Override
public int hashCode() {
return Objects.hash(test);
}
@Override
public String toString() {
StringJoiner joiner = new StringJoiner(", ", "{ ", " }");
joiner.add("test: " + test);
return joiner.toString();
}
public static TypeWithMandatoryField.Builder builder() {
return new TypeWithMandatoryField.Builder();
}
public static class Builder {
private int test;
public Builder() {
}
public Builder setTest(int test) {
this.test = test;
return this;
}
public TypeWithMandatoryField build() {
return new TypeWithMandatoryField(test);
}
}
}
\ No newline at end of file
src/test/resources/schemas/optional-vs-mandatory-types.graphqls
0 → 100644
浏览文件 @
c8df4854
type TypeWithMandatoryField implements InterfaceWithOptionalField {
test: Int!
}
interface InterfaceWithOptionalField {
test: Int
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录