Options validation error messages in non-interactive mode
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 65/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Bastante claro
- Estado de actividad
- Activo
- Stack tecnológico
- java, spring-boot
- Área
- cli
Línea de trabajo
Start with NonInteractiveShellRunner, which appears in the reported stack trace, and inspect how validation failures become CommandExecutionException messages. The related customization points named in the issue are CommandExceptionResolver and CommandCatalogCustomizer; done means non-interactive validation exposes the validator's message instead of only USAGE_ERROR, with stack-trace suppression considered separately.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Using Spring Shell 4.0.3 with Spring Boot 4.0.8, non-interactive mode (spring.shell.interactive.enabled=false).
When I add Bean Validation constraints to my @Options, and I start my application by specifying an argument which does not satisfy them, I get a very generic message, which does not explain at all what went wrong:
2026-10-02T16:45:29.372+02:00 ERROR 15460 --- [MyApp] [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.shell.core.command.CommandExecutionException: Unable to execute command plan -n testGen -c 0: USAGE_ERROR
at org.springframework.shell.core.NonInteractiveShellRunner.executeCommand(NonInteractiveShellRunner.java:162) ~[spring-shell-core-4.0.3.jar:4.0.3]
at org.springframework.shell.core.NonInteractiveShellRunner.run(NonInteractiveShellRunner.java:95) ~[spring-shell-core-4.0.3.jar:4.0.3]
at org.springframework.shell.core.autoconfigure.ShellRunnerAutoConfiguration.lambda$springShellApplicationRunner$0(ShellRunnerAutoConfiguration.java:39) ~[spring-shell-core-autoconfigure-4.0.3.jar:4.0.3]
at org.springframework.boot.SpringApplication.lambda$callRunner$0(SpringApplication.java:788) ~[spring-boot-4.0.8.jar:4.0.8]
at org.springframework.util.function.ThrowingConsumer$1.acceptWithException(ThrowingConsumer.java:82) ~[spring-core-7.0.9.jar:7.0.9]
at org.springframework.util.function.ThrowingConsumer.accept(ThrowingConsumer.java:60) ~[spring-core-7.0.9.jar:7.0.9]
at org.springframework.util.function.ThrowingConsumer$1.accept(ThrowingConsumer.java:86) ~[spring-core-7.0.9.jar:7.0.9]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:800) ~[spring-boot-4.0.8.jar:4.0.8]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:788) ~[spring-boot-4.0.8.jar:4.0.8]
at org.springframework.boot.SpringApplication.lambda$callRunners$0(SpringApplication.java:776) ~[spring-boot-4.0.8.jar:4.0.8]
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) ~[na:na]
at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na]
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) ~[na:na]
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[na:na]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:776) ~[spring-boot-4.0.8.jar:4.0.8]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:328) ~[spring-boot-4.0.8.jar:4.0.8]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1365) ~[spring-boot-4.0.8.jar:4.0.8]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) ~[spring-boot-4.0.8.jar:4.0.8]
at example.MyApp.main(MyApp.java:31) ~[classes/:na]
In this case, I was specifying -c 0 while that option has @Min(1).
I would expect in some way to get the contents of the validation error message, as specified on the @Min annotation. Or, more generically, the error message supplied by the validator (in case custom error messages are built by my custom validator).
Asking AI, it suggests a quite complex customization through either CommandCatalogCustomizer or CommandExceptionResolver, which anyway requires to unwrap and inspect the ConstraintViolationException. Isn't there a built-in way to do this?
The default behavior I'm seeing seems to fully defeat the purpose of using the Bean Validation API.
Also suppressing the full stack trace would be nice, however, at least seeing the actual message (even if buried in the stack trace) would be better than nothing. What I'm trying to do is to write a command-line interface fro my Spring Boot app. Thanks!
- Lenguaje dominante
- Java
- Estrellas
- 826
- Forks
- 404
- Merge medio
- 6 d 9 h
- PR fusionados (30 d)
- 1
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de spring-projects/spring-shell
-
NonInteractiveShellRunner, wrong exit value when Commands cannot be parsedPosiblemente ocupada @czpilar la tomó hace 1 día. Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 72/100
spring-projects/spring-shell#1391 · 2 comentarios ·
-
type/enhancement
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
spring-projects/spring-shell#1383 · 6 comentarios ·
-
Revisit dependency to reactorAbiertoarea/dependencies type/enhancement
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
spring-projects/spring-shell#1213 · 1 reacción ·
-
area/dependencies type/enhancement
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
spring-projects/spring-shell#1205 · 1 comentario ·
-
Spring CLI AI AgentAbiertostatus/need-triage
Dificultad 5/5 Más de una semana Aptitud para principiantes 20/100
spring-projects/spring-shell#1198 · 2 comentarios ·
Todos los issues de spring-projects/spring-shell
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
commonmark/commonmark-java#460 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
-
1.21.1见幽匿感测体就崩溃Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
-
Make branch and label autocomplete matching locale-independentPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 83/100
jenkinsci/gitlab-plugin#1950 ·
-
Place type search does not workAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
commons-app/apps-android-commons#6984 ·
Los mantenedores suelen responder en 2 días