diff --git a/core/mybatis-generator-core/src/main/java/org/mybatis/generator/api/dom/java/FullyQualifiedJavaType.java b/core/mybatis-generator-core/src/main/java/org/mybatis/generator/api/dom/java/FullyQualifiedJavaType.java index 0e268e642d..a33562dbec 100644 --- a/core/mybatis-generator-core/src/main/java/org/mybatis/generator/api/dom/java/FullyQualifiedJavaType.java +++ b/core/mybatis-generator-core/src/main/java/org/mybatis/generator/api/dom/java/FullyQualifiedJavaType.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2023 the original author or authors. + * Copyright 2006-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -87,21 +87,7 @@ public boolean isExplicitlyImported() { * @return Returns the fullyQualifiedName. */ public String getFullyQualifiedName() { - StringBuilder sb = new StringBuilder(); - if (wildcardType) { - sb.append('?'); - if (boundedWildcard) { - if (extendsBoundedWildcard) { - sb.append(" extends "); //$NON-NLS-1$ - } else { - sb.append(" super "); //$NON-NLS-1$ - } - - sb.append(baseQualifiedName); - } - } else { - sb.append(baseQualifiedName); - } + StringBuilder sb = new StringBuilder(getFullyQualifiedNameWithoutTypeParameters()); if (!typeArguments.isEmpty()) { boolean first = true; @@ -122,6 +108,30 @@ public String getFullyQualifiedName() { } public String getFullyQualifiedNameWithoutTypeParameters() { + StringBuilder sb = new StringBuilder(); + if (wildcardType) { + sb.append('?'); + if (boundedWildcard) { + if (extendsBoundedWildcard) { + sb.append(" extends "); //$NON-NLS-1$ + } else { + sb.append(" super "); //$NON-NLS-1$ + } + + sb.append(baseQualifiedName); + } + } else { + sb.append(baseQualifiedName); + } + return sb.toString(); + } + + /** + * The name (fully qualified) that should be imported + * + * @return the fully qualified name that should be imported. Does not include the wildcard bounds. + */ + public String getImportName() { return baseQualifiedName; } @@ -168,21 +178,7 @@ public String getPackageName() { } public String getShortName() { - StringBuilder sb = new StringBuilder(); - if (wildcardType) { - sb.append('?'); - if (boundedWildcard) { - if (extendsBoundedWildcard) { - sb.append(" extends "); //$NON-NLS-1$ - } else { - sb.append(" super "); //$NON-NLS-1$ - } - - sb.append(baseShortName); - } - } else { - sb.append(baseShortName); - } + StringBuilder sb = new StringBuilder(getShortNameWithoutTypeArguments()); if (!typeArguments.isEmpty()) { boolean first = true; @@ -203,7 +199,22 @@ public String getShortName() { } public String getShortNameWithoutTypeArguments() { - return baseShortName; + StringBuilder sb = new StringBuilder(); + if (wildcardType) { + sb.append('?'); + if (boundedWildcard) { + if (extendsBoundedWildcard) { + sb.append(" extends "); //$NON-NLS-1$ + } else { + sb.append(" super "); //$NON-NLS-1$ + } + + sb.append(baseShortName); + } + } else { + sb.append(baseShortName); + } + return sb.toString(); } @Override diff --git a/core/mybatis-generator-core/src/main/java/org/mybatis/generator/api/dom/java/JavaDomUtils.java b/core/mybatis-generator-core/src/main/java/org/mybatis/generator/api/dom/java/JavaDomUtils.java index 6543029964..ee06342cf2 100644 --- a/core/mybatis-generator-core/src/main/java/org/mybatis/generator/api/dom/java/JavaDomUtils.java +++ b/core/mybatis-generator-core/src/main/java/org/mybatis/generator/api/dom/java/JavaDomUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2023 the original author or authors. + * Copyright 2006-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -81,7 +81,7 @@ private static boolean typeIsInSamePackage(CompilationUnit compilationUnit, private static boolean typeIsAlreadyImported(CompilationUnit compilationUnit, FullyQualifiedJavaType fullyQualifiedJavaType) { - String name = fullyQualifiedJavaType.getFullyQualifiedNameWithoutTypeParameters(); + String name = fullyQualifiedJavaType.getImportName(); return compilationUnit.getImportedTypes().stream().anyMatch(e -> e.getImportList().contains(name)); } } diff --git a/core/mybatis-generator-core/src/test/java/org/mybatis/generator/api/dom/java/FullyQualifiedJavaTypeTest.java b/core/mybatis-generator-core/src/test/java/org/mybatis/generator/api/dom/java/FullyQualifiedJavaTypeTest.java index ae61eaf73e..3a35ee49b3 100644 --- a/core/mybatis-generator-core/src/test/java/org/mybatis/generator/api/dom/java/FullyQualifiedJavaTypeTest.java +++ b/core/mybatis-generator-core/src/test/java/org/mybatis/generator/api/dom/java/FullyQualifiedJavaTypeTest.java @@ -15,11 +15,13 @@ */ package org.mybatis.generator.api.dom.java; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; +import org.mybatis.generator.api.dom.java.render.TopLevelInterfaceRenderer; /** * @author Jeff Butler @@ -269,4 +271,76 @@ void testComplexArrayWithoutGenerics() { assertTrue(fqjt.getImportList().contains("java.util.List")); assertFalse(fqjt.getImportList().contains("java.util.List[]")); } + + @Test + void gh1288Test1() { + FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("Class"); + assertThat(fqjt.getFullyQualifiedName()).isEqualTo("Class"); + + Method method = new Method("setConverter"); + Parameter parameter = new Parameter(fqjt, "converterType"); + method.addParameter(parameter); + method.setAbstract(true); + + Interface interfaze = new Interface("foo.Bar"); + interfaze.setVisibility(JavaVisibility.PUBLIC); + interfaze.addMethod(method); + + TopLevelInterfaceRenderer renderer = new TopLevelInterfaceRenderer(); + String out = renderer.render(interfaze); + + assertThat(out).isEqualToNormalizingNewlines("package foo;\n\npublic interface Bar {\n void setConverter(Class converterType);\n}"); + } + + @Test + void gh1288Test2() { + FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("Class"); + assertThat(fqjt.getFullyQualifiedName()).isEqualTo("Class"); + + Method method = new Method("setConverter"); + Parameter parameter = new Parameter(fqjt, "converterType"); + method.addParameter(parameter); + method.setAbstract(true); + + Interface interfaze = new Interface("foo.Bar"); + interfaze.setVisibility(JavaVisibility.PUBLIC); + interfaze.addMethod(method); + + TopLevelInterfaceRenderer renderer = new TopLevelInterfaceRenderer(); + String out = renderer.render(interfaze); + + assertThat(out).isEqualToNormalizingNewlines("package foo;\n\npublic interface Bar {\n void setConverter(Class converterType);\n}"); + } + + @Test + void gh1288Test3() { + FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("Class"); + fqjt.addTypeArgument(new FullyQualifiedJavaType("? extends HttpMessageConverter")); + assertThat(fqjt.getFullyQualifiedName()).isEqualTo("Class>"); + + Method method = new Method("setConverter"); + Parameter parameter = new Parameter(fqjt, "converterType"); + method.addParameter(parameter); + method.setAbstract(true); + + Interface interfaze = new Interface("foo.Bar"); + interfaze.setVisibility(JavaVisibility.PUBLIC); + interfaze.addMethod(method); + + TopLevelInterfaceRenderer renderer = new TopLevelInterfaceRenderer(); + String out = renderer.render(interfaze); + + assertThat(out).isEqualToNormalizingNewlines("package foo;\n\npublic interface Bar {\n void setConverter(Class> converterType);\n}"); + } + + @Test + void gh1288Test3Minified() { + FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("Class"); + fqjt.addTypeArgument(new FullyQualifiedJavaType("? extends HttpMessageConverter")); + assertThat(fqjt.getFullyQualifiedName()).isEqualTo("Class>"); + + Parameter parameter = new Parameter(fqjt, "converterType"); + String out = parameter.toString(); + assertThat(out).isEqualTo("Class> converterType"); + } }