Polishing.

Improve BadJpqlGrammarException by including the underlying grammar.
This commit is contained in:
Mark Paluch
2025-01-09 14:29:35 +01:00
parent 90f7ed99fd
commit a3cf49977a
3 changed files with 22 additions and 5 deletions

View File

@@ -29,14 +29,21 @@ class BadJpqlGrammarErrorListener extends BaseErrorListener {
private final String query;
private final String grammar;
BadJpqlGrammarErrorListener(String query) {
this(query, "JPQL");
}
BadJpqlGrammarErrorListener(String query, String grammar) {
this.query = query;
this.grammar = grammar;
}
@Override
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine,
String msg, RecognitionException e) {
throw new BadJpqlGrammarException("Line " + line + ":" + charPositionInLine + " " + msg, query, null);
throw new BadJpqlGrammarException("Line " + line + ":" + charPositionInLine + " " + msg, grammar, query, null);
}
}

View File

@@ -30,7 +30,11 @@ public class BadJpqlGrammarException extends InvalidDataAccessResourceUsageExcep
private final String jpql;
public BadJpqlGrammarException(String message, String jpql, @Nullable Throwable cause) {
super(message + "; Bad JPQL grammar [" + jpql + "]", cause);
this(message, jpql, "JPQL", cause);
}
BadJpqlGrammarException(String message, String grammar, String jpql, @Nullable Throwable cause) {
super(message + "; Bad " + grammar + " grammar [" + jpql + "]", cause);
this.jpql = jpql;
}

View File

@@ -72,7 +72,13 @@ class JpaQueryEnhancer implements QueryEnhancer {
Lexer lexer = lexerFactoryFunction.apply(CharStreams.fromString(query));
P parser = parserFactoryFunction.apply(new CommonTokenStream(lexer));
configureParser(query, lexer, parser);
String grammar = lexer.getGrammarFileName();
int dot = grammar.lastIndexOf('.');
if (dot != -1) {
grammar = grammar.substring(0, dot);
}
configureParser(query, grammar.toUpperCase(), lexer, parser);
return parseFunction.apply(parser);
}
@@ -84,9 +90,9 @@ class JpaQueryEnhancer implements QueryEnhancer {
* @param lexer
* @param parser
*/
static void configureParser(String query, Lexer lexer, Parser parser) {
static void configureParser(String query, String grammar, Lexer lexer, Parser parser) {
BadJpqlGrammarErrorListener errorListener = new BadJpqlGrammarErrorListener(query);
BadJpqlGrammarErrorListener errorListener = new BadJpqlGrammarErrorListener(query, grammar);
lexer.removeErrorListeners();
lexer.addErrorListener(errorListener);