--- name: java description: Java 开发。企业级应用、Spring Boot、微服务。当用户提到 Java、Spring、Maven、Gradle、JVM 时使用。 --- # 📜 符箓秘典 · Java ## Spring Boot ### 基础项目 ```java @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } // Controller @RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public ResponseEntity getUser(@PathVariable Long id) { return userService.findById(id) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } @PostMapping public ResponseEntity createUser(@Valid @RequestBody UserDTO dto) { User user = userService.create(dto); return ResponseEntity.status(HttpStatus.CREATED).body(user); } } // Service @Service public class UserService { @Autowired private UserRepository userRepository; public Optional findById(Long id) { return userRepository.findById(id); } @Transactional public User create(UserDTO dto) { User user = new User(); user.setName(dto.getName()); user.setEmail(dto.getEmail()); return userRepository.save(user); } } // Repository @Repository public interface UserRepository extends JpaRepository { Optional findByEmail(String email); List findByNameContaining(String name); } ``` ### Entity ```java @Entity @Table(name = "users") @Data @NoArgsConstructor @AllArgsConstructor public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String name; @Column(unique = true, nullable = false) private String email; @CreatedDate private LocalDateTime createdAt; @LastModifiedDate private LocalDateTime updatedAt; } // DTO @Data public class UserDTO { @NotBlank(message = "Name is required") private String name; @Email(message = "Invalid email") @NotBlank(message = "Email is required") private String email; } ``` ### 配置 ```yaml # application.yml spring: datasource: url: jdbc:postgresql://localhost:5432/mydb username: ${DB_USER} password: ${DB_PASS} jpa: hibernate: ddl-auto: update show-sql: true server: port: 8080 logging: level: root: INFO com.myapp: DEBUG ``` ## 异常处理 ```java @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ResourceNotFoundException.class) public ResponseEntity handleNotFound(ResourceNotFoundException ex) { ErrorResponse error = new ErrorResponse( HttpStatus.NOT_FOUND.value(), ex.getMessage() ); return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error); } @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity handleValidation(MethodArgumentNotValidException ex) { String message = ex.getBindingResult().getFieldErrors().stream() .map(FieldError::getDefaultMessage) .collect(Collectors.joining(", ")); ErrorResponse error = new ErrorResponse( HttpStatus.BAD_REQUEST.value(), message ); return ResponseEntity.badRequest().body(error); } } // 自定义异常 public class ResourceNotFoundException extends RuntimeException { public ResourceNotFoundException(String message) { super(message); } } ``` ## 测试 ```java @SpringBootTest @AutoConfigureMockMvc class UserControllerTest { @Autowired private MockMvc mockMvc; @MockBean private UserService userService; @Test void shouldGetUser() throws Exception { User user = new User(1L, "Alice", "alice@example.com"); when(userService.findById(1L)).thenReturn(Optional.of(user)); mockMvc.perform(get("/api/users/1")) .andExpect(status().isOk()) .andExpect(jsonPath("$.name").value("Alice")); } @Test void shouldCreateUser() throws Exception { UserDTO dto = new UserDTO(); dto.setName("Bob"); dto.setEmail("bob@example.com"); User user = new User(1L, "Bob", "bob@example.com"); when(userService.create(any())).thenReturn(user); mockMvc.perform(post("/api/users") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(dto))) .andExpect(status().isCreated()) .andExpect(jsonPath("$.name").value("Bob")); } } // 单元测试 @ExtendWith(MockitoExtension.class) class UserServiceTest { @Mock private UserRepository userRepository; @InjectMocks private UserService userService; @Test void shouldFindById() { User user = new User(1L, "Alice", "alice@example.com"); when(userRepository.findById(1L)).thenReturn(Optional.of(user)); Optional result = userService.findById(1L); assertTrue(result.isPresent()); assertEquals("Alice", result.get().getName()); } } ``` ## 项目结构 ``` myproject/ ├── pom.xml / build.gradle ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/myapp/ │ │ │ ├── Application.java │ │ │ ├── controller/ │ │ │ ├── service/ │ │ │ ├── repository/ │ │ │ ├── model/ │ │ │ ├── dto/ │ │ │ └── config/ │ │ └── resources/ │ │ └── application.yml │ └── test/ │ └── java/ └── target/ ``` ## 常用依赖 ```xml org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-validation org.projectlombok lombok ``` ---