我是新来的springboot,我试图遵循这个例子:https://github.com/eugenp/tutorials/tree/master/spring-caching-2
在我的应用程序中,我一直得到">错误:变量myApplicationService未在默认构造函数中初始化";但与我所遵循的教程相比,我不明白它是如何初始化的,这是我的控制器:
package com.springbootredis.controllers;
import com.springbootredis.service.MyApplicationService;
import lombok.AllArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;
@RestController
@AllArgsConstructor
@RequestMapping(value = "/person", produces = { MediaType.APPLICATION_JSON_VALUE })
public class PersonController {
private final MyApplicationService myApplicationService;//ERROR HERE
@GetMapping("/uuid")
public String generateRandomUUID() {
return UUID.randomUUID().toString();
}
@GetMapping("/addperson/{name}")
public String addPerson(@PathVariable String name) {
String ret = myApplicationService.addNewPerson(name);
return "Added person with name: " + name + " and id: " + ret;
}
@GetMapping("/deleteperson/{id}")
public String deletePerson(@PathVariable String id) {
String ret = myApplicationService.delete(id);
return "Deleted person. ID:" + id + " Name: " + ret;
}
@GetMapping("/updateperson/{id}/{name}")
public String updatePerson(@PathVariable String id, @PathVariable String name) {
myApplicationService.updatePerson(id, name);
return "Updated person. ID:" + id + " with Name: " + name;
}
@GetMapping("/getperson/{id}")
public String getPerson(@PathVariable String id) {
String ret = myApplicationService.findById(id);
return "Got person. ID:" + id + " Name: " + ret;
}
}
我尝试了autowired注释,但它说不推荐,构建仍然失败。我的建立。Gradle是这样的:
plugins {
id 'org.springframework.boot' version '2.7.1'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
id 'war'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-data-redis:2.7.0")
implementation("org.springframework.boot:spring-boot-starter-cache:2.7.1")
implementation("org.projectlombok:lombok:1.18.24")
implementation("org.springframework.boot:spring-boot-dependencies:2.7.1")
runtimeOnly("mysql:mysql-connector-java:8.0.29")
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
任何帮助/指示将不胜感激。
编辑:(为了完整起见)正如您已经发现的,在您的build.gradle
文件中缺少Lombok的annotationProcessor
条目。此外,您的Lombok条目可以是compileOnly
,并且不需要在运行时包含。
原答案如下
您的代码原样应该仍然可以工作。正如@m-deinum所提到的,你还应该避免对Spring版本进行手动依赖管理。
说,Lombok魔法通过注释处理,一个特性可能不是默认启用IDE项目。
导致错误的一个可能原因是该特性被禁用,因此Lombok没有生成构造函数,只有一个默认的、无参数的构造函数可用。一旦启用它,编译错误就会消失。
也就是说,我发现@AllArgsConstructor
在设计类时不是很健壮。喜欢@RequiredArgsConstructor
还是简单的显式构造函数和设计你的类有不变的状态。
为了解决我的问题,我在构建中添加了以下内容。Gradle文件下的dependencies部分:
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
annotationProcessor("org.projectlombok:lombok:1.18.24")