build.gradle
Code: Select all
plugins {
id 'java'
id 'org.springframework.boot' version '4.0.0'
id 'io.spring.dependency-management' version '1.1.7'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
description = 'Demo project for Spring Boot'
java {
sourceCompatibility = '17'
}
repositories {
mavenCentral()
}
dependencies {
// Rest API
implementation 'org.springframework.boot:spring-boot-starter-webmvc'
testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test'
// Database
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
runtimeOnly 'com.h2database:h2'
// Security
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
testImplementation 'org.springframework.security:spring-security-test'
// Test
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
test {
testLogging {
events "passed", "skipped", "failed" //, "standardOut", "standardError"
showExceptions true
exceptionFormat "full"
showCauses true
showStackTraces true
// Change from false to true
showStandardStreams = true
}
}
Code: Select all
interface DemoRepository extends CrudRepository, PagingAndSortingRepository {
boolean existsByIdAndOwner(Long id, String owner);
Demo findByIdAndOwner(Long id, String owner);
Page findByOwner(String owner, Pageable pageable);
}
(Ich habe die auf der Spring Academy vorgeschlagene problematische Zeile kommentiert und durch die einfachere oben ersetzt.)
Code: Select all
@GetMapping
private ResponseEntity readDemos(Pageable pageable, Principal principal) {
Page page = demoRepository.findByOwner(principal.getName(),
PageRequest.of(
pageable.getPageNumber(),
pageable.getPageSize(),
pageable.getSort()
// pageable.getSortOr(Sort.by(Sort.Direction.ASC, "amount"))
));
return ResponseEntity.ok(page.getContent());
}
(Wenn ich den vorherigen Code verwende, funktioniert es einwandfrei. Wenn ich jedoch die auskommentierte Zeile verwende, bricht sie ab.)
Code: Select all
@Test
void readDemos_sorting() {
EntityExchangeResult result = client.get()
.uri("/demo?page=0&size=1&sort=amount,desc")
.header(HttpHeaders.AUTHORIZATION, authHeader)
.exchange()
.expectStatus()
.isOk()
.expectHeader()
.contentTypeCompatibleWith(MediaType.APPLICATION_JSON)
.expectBody(String.class)
.returnResult();
String responseBody = result.getResponseBody();
DocumentContext documentContext = JsonPath.parse(responseBody);
JSONArray read = documentContext.read("$[*]");
assertThat(read.size()).isEqualTo(3);
double amount = documentContext.read("$[0].amount");
assertThat(amount).isEqualTo(150.00);
}
Code: Select all
org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "DEMO.AMOUNT" must be in the GROUP BY list; SQL statement:
SELECT COUNT(*) FROM "DEMO" WHERE "DEMO"."OWNER" = ? ORDER BY "DEMO"."AMOUNT" ASC [90016-240]
Einerseits kann ich pageable.getSort() verwenden, um einen Standardaufruf ohne Sortierparameter zu unterstützen; es unterstützt auch Sortierparameter; aber ich kann diese Sortierparameter nicht mit den Paginierungsparametern kombinieren, sonst schlägt es fehl.
Wenn ich andererseits pageable.getSortOr(Sort.by(Sort.Direction.ASC, "amount")) verwende, schlägt die gesamte Sortierung fehl, und wenn ich Paginierungsparameter ohne Sortierparameter verwende, erhalte ich diesen SQL-Fehler.
Sehen Sie sich den vollständigen Code auf GitHub an
Mobile version