點擊上方的語言選單以切換語言
這篇文章會帶各位從 IntelliJ IDEA 建立 Spring Boot 後端,一直到 Vue3 使用 Axios 成功呼叫後端 API。 包含防火牆、Supabase 連線、全套步驟與各類別用途解說。
步驟如下:
建立後 IntelliJ 會生成基本專案骨架。
一般 Spring Boot 專案的 pom.xml 如:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
新增完後:
右上角 Maven → Reload All Projects
原本的紅字會變成黃字 → 套件成功載入。
src/main/java/ ├─ entity/ ← 資料庫對應的類別 ├─ repository/ ← 連接資料庫(DAO) ├─ service/ ← 商業邏輯處理 ├─ controller/ ← API 入口 ├─ dto/ ← 前後端交換資料的格式 ├─ config/ ← 設定檔(CORS / Bean / 連線設定) └─ Application.java ← 主程式入口
@GetMapping, @PostMapping。在 src/main/resources/ 裡建立:
spring.datasource.url=jdbc:postgresql://YOUR_DB_HOST:5432/postgres spring.datasource.username=postgres spring.datasource.password=YOUR_SUPABASE_PASSWORD spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true
Supabase 會提供 PostgreSQL 連線資訊。
@Entity
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
public interface UserRepository extends JpaRepository<User, Long> {
}
@Service
public class UserService {
@Autowired
private UserRepository repo;
public List<User> getAll() {
return repo.findAll();
}
}
@RestController
@RequestMapping("/api/users")
@CrossOrigin("*")
public class UserController {
@Autowired
private UserService service;
@GetMapping
public List<User> getAllUsers() {
return service.getAll();
}
}
DTO 用來定義前後端交換資料的格式,它只包含必要的欄位,並且有助於保護內部實體類別的結構。
public class UserDTO {
private Long id;
private String name;
// 預設構造方法、getter、setter
public UserDTO(Long id, String name) {
this.id = id;
this.name = name;
}
// 其他getter和setter方法
}
在 Controller 中,將 Entity 轉換為 DTO 進行返回:
@RestController
@RequestMapping("/api/users")
@CrossOrigin("*")
public class UserController {
@Autowired
private UserService service;
@GetMapping
public List<UserDTO> getAllUsers() {
List<User> users = service.getAll();
return users.stream()
.map(user -> new UserDTO(user.getId(), user.getName())) // 將 Entity 轉換為 DTO
.collect(Collectors.toList());
}
}
Config 類別負責設定應用程式的特定配置,例如 CORS 設置、Bean 設置等。
如果前端和後端部署在不同的域名或端口上,需要配置 CORS 來允許跨域請求。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 允許所有路徑
.allowedOrigins("http://localhost:5173") // 允許來自該源的請求
.allowedMethods("GET", "POST", "PUT", "DELETE") // 允許的 HTTP 方法
.allowedHeaders("*"); // 允許的標頭
}
}
可以在 `Config` 類別中自定義一些 Bean,例如 ObjectMapper 設置 JSON 格式化等。
@Configuration
public class BeanConfig {
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
}
}
雖然通常 `application.properties` 已經能滿足大多數的配置需求,但如果需要額外的配置,可以在 `Config` 類別中設置。
@Configuration
@EnableJpaRepositories(basePackages = "com.example.repository")
public class JpaConfig {
// 可在此進行額外的 JPA 配置
}
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
執行後端:按右上角綠色箭頭 RUN
Spring Boot 會開啟 server → http://localhost:8080
建立專案:
npm init vue@latest npm install npm install axios npm run dev
前端執行在:http://localhost:5173/
在 src/services/api.js:
import axios from "axios";
const api = axios.create({
baseURL: "http://localhost:8080/api",
});
export default api;
在 Vue 組件中:
import api from "../services/api.js";
onMounted(async () => {
const res = await api.get("/users");
console.log(res.data);
});
成功後:前端會印出後端資料。
許多學校(包括大學宿舍)與租屋處會擋:
最簡單解法: 👉 連自己手機的 WiFi 熱點(最乾淨、不會被擋)
我當初後端連不到,就是這個原因。