如同常見的專案架構,Controller 作為 Spring Boot 應用程式中的 REST API 控制器,負責接收前端請求、呼叫 Service,並將結果回傳給前端。以 AIRecommendationController 為例:
@RestController
@RequestMapping("/api/recommendations")
@CrossOrigin(origins = "*")
public class AIRecommendationController {
    
    @Autowired
    private AIRecommendationService aiRecommendationService;
    
    @Autowired
    private UserPreferenceService userPreferenceService;
    
    @Autowired
    private BedrockAIService bedrockAIService;
    
    @PostMapping("/generate")
    public ResponseEntity<RecommendationResponse> generateRecommendation(
            @Valid @RequestBody RecommendationRequest request) {
        
        try {
            RecommendationResponse response = aiRecommendationService.generateRecommendation(
                request.getUserInput(), request.getUsername());
            
            // 分析並更新使用者偏好(如果有使用者名稱)
            System.out.println("Request Username: " + request.getUsername());
            System.out.println("Response Recommendations: " + response.getRecommendations());
            if (request.getUsername() != null && !request.getUsername().isEmpty() && 
                response.getRecommendations() != null) {
                
                List<String> recommendedDrinkNames = response.getRecommendations().stream()
                    .map(RecommendationResponse.DrinkRecommendation::getName)
                    .toList();
                
                userPreferenceService.analyzeAndUpdatePreferences(
                    request.getUsername(), request.getUserInput(), recommendedDrinkNames);
            }
            
            return ResponseEntity.ok(response);
            
        } catch (Exception e) {
            return ResponseEntity.badRequest()
                .body(RecommendationResponse.error("推薦生成失敗:" + e.getMessage()));
        }
    }
    
    @GetMapping("/test")
    public ResponseEntity<String> test() {
        return ResponseEntity.ok("AI Recommendation API is working!");
    }
    
    @GetMapping("/service-status")
    public ResponseEntity<Map<String, Object>> getServiceStatus() {
        Map<String, Object> status = new HashMap<>();
        status.put("serviceType", bedrockAIService.getCurrentServiceType());
        status.put("isBedrockAvailable", bedrockAIService.isBedrockConfigured());
        status.put("timestamp", java.time.LocalDateTime.now());
        return ResponseEntity.ok(status);
    }
}
主要結構説明:
@RestController 標註,表示回傳 JSON 格式資料,並以 /api/recommendations 為路徑前綴。@Autowired 注入三個 Service,分別負責 AI 推薦內容生成、使用者偏好分析、Bedrock AI 狀態查詢。generateRecommendation 方法處理前端 POST 請求,接收推薦請求資料,呼叫 AIRecommendationService 產生推薦結果。若有使用者名稱,則進一步呼叫 UserPreferenceService 分析並更新偏好。test 方法則提供 API 健康檢查,回傳簡單訊息。getServiceStatus 方法可以直接查詢 Bedrock AI 服務狀態,回傳目前服務型態、是否可用及時間戳記。如此一來,Controller 只要負責接收 HTTP 請求,將資料傳給 Service 處理,並將結果(或錯誤)包裝成 ResponseEntity 回傳前端,就能實現前後端分離的架構。