diff --git a/clients/src/main/java/org/apache/kafka/common/InvalidRecordException.java b/clients/src/main/java/org/apache/kafka/common/InvalidRecordException.java
index 4c2815bb3bd..aa13ffd9936 100644
--- a/clients/src/main/java/org/apache/kafka/common/InvalidRecordException.java
+++ b/clients/src/main/java/org/apache/kafka/common/InvalidRecordException.java
@@ -16,9 +16,9 @@
*/
package org.apache.kafka.common;
-import org.apache.kafka.common.errors.ApiException;
+import org.apache.kafka.common.errors.InvalidConfigurationException;
-public class InvalidRecordException extends ApiException {
+public class InvalidRecordException extends InvalidConfigurationException {
private static final long serialVersionUID = 1;
diff --git a/clients/src/main/java/org/apache/kafka/common/errors/AuthenticationException.java b/clients/src/main/java/org/apache/kafka/common/errors/AuthenticationException.java
index 7a05eba03f2..5d1d5070173 100644
--- a/clients/src/main/java/org/apache/kafka/common/errors/AuthenticationException.java
+++ b/clients/src/main/java/org/apache/kafka/common/errors/AuthenticationException.java
@@ -32,7 +32,7 @@ import javax.net.ssl.SSLException;
*
{@link SslAuthenticationException} if SSL handshake failed due to any {@link SSLException}.
*
*/
-public class AuthenticationException extends ApiException {
+public class AuthenticationException extends InvalidConfigurationException {
private static final long serialVersionUID = 1L;
diff --git a/clients/src/main/java/org/apache/kafka/common/errors/AuthorizationException.java b/clients/src/main/java/org/apache/kafka/common/errors/AuthorizationException.java
index 0471fe643d9..8ff29af9597 100644
--- a/clients/src/main/java/org/apache/kafka/common/errors/AuthorizationException.java
+++ b/clients/src/main/java/org/apache/kafka/common/errors/AuthorizationException.java
@@ -16,7 +16,7 @@
*/
package org.apache.kafka.common.errors;
-public class AuthorizationException extends ApiException {
+public class AuthorizationException extends InvalidConfigurationException {
public AuthorizationException(String message) {
super(message);
diff --git a/clients/src/main/java/org/apache/kafka/common/errors/InvalidConfigurationException.java b/clients/src/main/java/org/apache/kafka/common/errors/InvalidConfigurationException.java
index 333566a64ba..85e63c42ec3 100644
--- a/clients/src/main/java/org/apache/kafka/common/errors/InvalidConfigurationException.java
+++ b/clients/src/main/java/org/apache/kafka/common/errors/InvalidConfigurationException.java
@@ -20,12 +20,20 @@ public class InvalidConfigurationException extends ApiException {
private static final long serialVersionUID = 1L;
- public InvalidConfigurationException(String message) {
- super(message);
- }
-
public InvalidConfigurationException(String message, Throwable cause) {
super(message, cause);
}
+ public InvalidConfigurationException(String message) {
+ super(message);
+ }
+
+ public InvalidConfigurationException(Throwable cause) {
+ super(cause);
+ }
+
+ public InvalidConfigurationException() {
+ super();
+ }
+
}
diff --git a/clients/src/main/java/org/apache/kafka/common/errors/InvalidReplicationFactorException.java b/clients/src/main/java/org/apache/kafka/common/errors/InvalidReplicationFactorException.java
index 699d5a83a43..508d73a793f 100644
--- a/clients/src/main/java/org/apache/kafka/common/errors/InvalidReplicationFactorException.java
+++ b/clients/src/main/java/org/apache/kafka/common/errors/InvalidReplicationFactorException.java
@@ -16,7 +16,7 @@
*/
package org.apache.kafka.common.errors;
-public class InvalidReplicationFactorException extends ApiException {
+public class InvalidReplicationFactorException extends InvalidConfigurationException {
private static final long serialVersionUID = 1L;
diff --git a/clients/src/main/java/org/apache/kafka/common/errors/InvalidRequiredAcksException.java b/clients/src/main/java/org/apache/kafka/common/errors/InvalidRequiredAcksException.java
index 423c09166b7..f861dbfee18 100644
--- a/clients/src/main/java/org/apache/kafka/common/errors/InvalidRequiredAcksException.java
+++ b/clients/src/main/java/org/apache/kafka/common/errors/InvalidRequiredAcksException.java
@@ -16,7 +16,7 @@
*/
package org.apache.kafka.common.errors;
-public class InvalidRequiredAcksException extends ApiException {
+public class InvalidRequiredAcksException extends InvalidConfigurationException {
private static final long serialVersionUID = 1L;
public InvalidRequiredAcksException(String message) {
diff --git a/clients/src/main/java/org/apache/kafka/common/errors/InvalidTopicException.java b/clients/src/main/java/org/apache/kafka/common/errors/InvalidTopicException.java
index 344d231ce9e..cf0ed5ed5cc 100644
--- a/clients/src/main/java/org/apache/kafka/common/errors/InvalidTopicException.java
+++ b/clients/src/main/java/org/apache/kafka/common/errors/InvalidTopicException.java
@@ -27,7 +27,7 @@ import java.util.Set;
*
* @see UnknownTopicOrPartitionException
*/
-public class InvalidTopicException extends ApiException {
+public class InvalidTopicException extends InvalidConfigurationException {
private static final long serialVersionUID = 1L;
private final Set invalidTopics;
diff --git a/clients/src/main/java/org/apache/kafka/common/errors/RecordBatchTooLargeException.java b/clients/src/main/java/org/apache/kafka/common/errors/RecordBatchTooLargeException.java
index d1ba8ff7160..24f563e1c27 100644
--- a/clients/src/main/java/org/apache/kafka/common/errors/RecordBatchTooLargeException.java
+++ b/clients/src/main/java/org/apache/kafka/common/errors/RecordBatchTooLargeException.java
@@ -19,7 +19,7 @@ package org.apache.kafka.common.errors;
/**
* This record batch is larger than the maximum allowable size
*/
-public class RecordBatchTooLargeException extends ApiException {
+public class RecordBatchTooLargeException extends InvalidConfigurationException {
private static final long serialVersionUID = 1L;
diff --git a/clients/src/main/java/org/apache/kafka/common/errors/UnsupportedForMessageFormatException.java b/clients/src/main/java/org/apache/kafka/common/errors/UnsupportedForMessageFormatException.java
index f66298e99c3..03add5c4ffc 100644
--- a/clients/src/main/java/org/apache/kafka/common/errors/UnsupportedForMessageFormatException.java
+++ b/clients/src/main/java/org/apache/kafka/common/errors/UnsupportedForMessageFormatException.java
@@ -20,7 +20,7 @@ package org.apache.kafka.common.errors;
* The message format version does not support the requested function. For example, if idempotence is
* requested and the topic is using a message format older than 0.11.0.0, then this error will be returned.
*/
-public class UnsupportedForMessageFormatException extends ApiException {
+public class UnsupportedForMessageFormatException extends InvalidConfigurationException {
private static final long serialVersionUID = 1L;
public UnsupportedForMessageFormatException(String message) {
diff --git a/clients/src/main/java/org/apache/kafka/common/errors/UnsupportedVersionException.java b/clients/src/main/java/org/apache/kafka/common/errors/UnsupportedVersionException.java
index 484947b0ae2..00da3a1b2b8 100644
--- a/clients/src/main/java/org/apache/kafka/common/errors/UnsupportedVersionException.java
+++ b/clients/src/main/java/org/apache/kafka/common/errors/UnsupportedVersionException.java
@@ -28,7 +28,7 @@ import java.util.Map;
* is raised from {@link org.apache.kafka.clients.consumer.KafkaConsumer#offsetsForTimes(Map)}, it would
* be possible to revert to alternative logic to set the consumer's position.
*/
-public class UnsupportedVersionException extends ApiException {
+public class UnsupportedVersionException extends InvalidConfigurationException {
private static final long serialVersionUID = 1L;
public UnsupportedVersionException(String message, Throwable cause) {
diff --git a/clients/src/test/java/org/apache/kafka/common/errors/TransactionExceptionHierarchyTest.java b/clients/src/test/java/org/apache/kafka/common/errors/TransactionExceptionHierarchyTest.java
index 1d6d47abc33..9738ccd6c81 100644
--- a/clients/src/test/java/org/apache/kafka/common/errors/TransactionExceptionHierarchyTest.java
+++ b/clients/src/test/java/org/apache/kafka/common/errors/TransactionExceptionHierarchyTest.java
@@ -16,6 +16,8 @@
*/
package org.apache.kafka.common.errors;
+import org.apache.kafka.common.InvalidRecordException;
+
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
@@ -94,4 +96,29 @@ public class TransactionExceptionHierarchyTest {
assertTrue(ApplicationRecoverableException.class.isAssignableFrom(exceptionClass),
exceptionClass.getSimpleName() + " should extend ApplicationRecoverableException");
}
+
+ /**
+ * Verifies that the given exception class extends `InvalidConfigurationException`
+ *
+ * @param exceptionClass the exception class to check
+ */
+ @ParameterizedTest
+ @ValueSource(classes = {
+ AuthenticationException.class,
+ AuthorizationException.class,
+ ClusterAuthorizationException.class,
+ TransactionalIdAuthorizationException.class,
+ UnsupportedVersionException.class,
+ UnsupportedForMessageFormatException.class,
+ InvalidRecordException.class,
+ InvalidRequiredAcksException.class,
+ RecordBatchTooLargeException.class,
+ InvalidTopicException.class,
+ TopicAuthorizationException.class,
+ GroupAuthorizationException.class
+ })
+ void testInvalidConfigurationExceptionHierarchy(Class extends Exception> exceptionClass) {
+ assertTrue(InvalidConfigurationException.class.isAssignableFrom(exceptionClass),
+ exceptionClass.getSimpleName() + " should extend InvalidConfigurationException");
+ }
}
diff --git a/core/src/main/scala/kafka/admin/ConfigCommand.scala b/core/src/main/scala/kafka/admin/ConfigCommand.scala
index ee1fbbca2da..b23b770558f 100644
--- a/core/src/main/scala/kafka/admin/ConfigCommand.scala
+++ b/core/src/main/scala/kafka/admin/ConfigCommand.scala
@@ -86,13 +86,13 @@ object ConfigCommand extends Logging {
opts.checkArgs()
processCommand(opts)
} catch {
- case e @ (_: IllegalArgumentException | _: InvalidConfigurationException | _: OptionException) =>
- logger.debug(s"Failed config command with args '${args.mkString(" ")}'", e)
+ case e: UnsupportedVersionException =>
+ logger.debug(s"Unsupported API encountered in server when executing config command with args '${args.mkString(" ")}'")
System.err.println(e.getMessage)
Exit.exit(1)
- case e: UnsupportedVersionException =>
- logger.debug(s"Unsupported API encountered in server when executing config command with args '${args.mkString(" ")}'")
+ case e @ (_: IllegalArgumentException | _: InvalidConfigurationException | _: OptionException) =>
+ logger.debug(s"Failed config command with args '${args.mkString(" ")}'", e)
System.err.println(e.getMessage)
Exit.exit(1)