VSCode上でJava+Spring Bootの環境構築~API開発
とりあえず環境準備
- Windows 11
- バージョンあとで確認
- OpenJDK
- Oracle
- 17.0.5 LTS
- Visual Studio Code
- 何の変哲もないもの
今後の作業の前提はこの環境で進む。
Mavenがよくわからなかったので一旦放置して次に進む。
Extension Pack for Java
を入れる
VSCodeに拡張機能
Spring Boot Extension Pack
を入れる
VSCodeに拡張機能 -
Create Java Project
する。- 順番に、
Spring Boot
Maven
3.0.2
Java
- 任意の名称
Jar
Java 17
Spring Web
- 順番に、
- プロジェクトが作成できたら右下に出てくる
Open
からVSCodeでフォルダを開く。
Mavenを別途インストールしなくてもよしなにやってくれるのが非常に快適。
Run しようとしてみる
demo\src\main\java\com\example\sample\demo\DemoApplication.java
を開くとこのように main メソッドの上に Run | Debug
と出ているのでRunしてみる。
コマンドが走る
が、 8080
にアクセスしてもこのように動作しない。
Controller classを追加する
MVCにおけるController classがないことが原因なので、 demo\src\main\java\com\example\sample\demo\DemoApplicationController.java
を作成し、RouteをMappingする。ひとまずHello Worldしたいので、以下のようにする。
package com.example.sample.demo;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
public class DemoApplicationController {
@RequestMapping("/")
public String test() {
return "Hello World!";
}
}
再度動かしてみると、無事にHello World! できた。
APIを開発するために書き直す
package com.example.sample.demo;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
@RequestMapping("/api")
public class DemoApplicationController {
@GetMapping("/hello")
public String test() {
return "Hello World!";
}
}
これで /api/hello
でアクセスできるようになった
Todoアプリ用のAPIを作っていく
DB設定をする
src/main/resources/application.properties
に MySQL データベースの設定を追加する。
# MySQL Properties
spring.datasource.url=XXXX
spring.datasource.username=root
spring.datasource.password=password
# JPA Properties
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
# Database Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
適宜置き換え。
タスクのモデルを作成
src/main/java/com/example/sample/demo/model/Task.java
を作成する。
package com.example.sample.demo.model;
import javax.persistence.*;
import java.time.LocalDate;
@Entity
@Table(name = "tasks") // 明示的にテーブル名を指定
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String detail;
private String category;
private LocalDate date;
private boolean completed;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
public boolean isCompleted() {
return completed;
}
public void setCompleted(boolean completed) {
this.completed = completed;
}
}
リポジトリの作成
src/main/java/com/example/sample/demo/repository/TaskRepository.java
を作成する。
package com.example.sample.demo.repository;
import com.example.sample.demo.model.Task;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface TaskRepository extends JpaRepository<Task, Long> {
}
サービスの作成
src/main/java/com/example/sample/demo/service/TaskService.java
を作成する。
package com.example.sample.demo.service;
import com.example.sample.demo.model.Task;
import com.example.sample.demo.repository.TaskRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class TaskService {
@Autowired
private TaskRepository taskRepository;
public List<Task> getAllTasks() {
return taskRepository.findAll();
}
}
コントローラーの更新
DemoApplicationController.java
を更新する。
package com.example.sample.demo;
import com.example.sample.demo.model.Task;
import com.example.sample.demo.service.TaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/api")
public class DemoApplicationController {
@Autowired
private TaskService taskService;
@GetMapping("/hello")
public String test() {
return "Hello World!";
}
@GetMapping("/tasks")
public List<Task> getTasks() {
return taskService.getAllTasks();
}
}
これで GET /api/tasks
でAPIが動作するようになる。
javax パッケージのエラー
javax
、 jakarta
という名称に変更されているのでエラーが起きるという話らしい。