javacontroller返回json格式的注解
时间: 2025-05-20 13:50:31 浏览: 11
### Java Controller 中返回 JSON 格式的注解
在 Spring MVC 框架中,`@RestController` 和 `@ResponseBody` 是两个常用的注解,用于将控制器方法的返回值转换为 JSON 或 XML 格式的数据,并将其写入 HTTP 响应体中。
#### 1. 使用 `@RestController`
`@RestController` 是一个组合注解,它实际上是 `@Controller` 和 `@ResponseBody` 的合集。当使用该注解标记类时,所有的方法默认都会应用 `@ResponseBody` 行为[^4]。
```java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class ExampleController {
@GetMapping("/data")
public Map<String, Object> getData() {
Map<String, Object> result = new HashMap<>();
result.put("key", "value");
return result;
}
}
```
上述代码中的 `/api/data` 接口会自动将返回的 `Map` 转换为 JSON 格式并发送给客户端。
---
#### 2. 使用 `@ResponseBody`
如果不想在整个类上标注 `@RestController`,也可以单独在某个方法上使用 `@ResponseBody` 注解来实现相同的效果。
```java
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/example")
public class AnotherExampleController {
@RequestMapping(value = "/jsonResponse", method = RequestMethod.GET)
@ResponseBody
public Map<String, Object> jsonResponse() {
Map<String, Object> data = new HashMap<>();
data.put("status", "success");
data.put("message", "This is a JSON response.");
return data;
}
}
```
在这个例子中,只有带有 `@ResponseBody` 的方法才会将数据序列化为 JSON 并返回给调用者。
---
#### 3. 自定义注解配合 AOP 实现日志记录或其他功能
除了框架自带的功能外,还可以通过自定义注解和 AOP 技术扩展更多能力。例如,在前面提到的内容基础上,可以通过创建一个新的注解(如 `@LogApi`),结合切面编程完成 API 请求的日志记录等功能[^5]。
以下是简单示例:
##### 定义自定义注解
```java
package com.example.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogApi {
String value() default "";
}
```
##### 编写对应的 Aspect 切片
```java
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class ApiLoggingAspect {
private static final Logger logger = LoggerFactory.getLogger(ApiLoggingAspect.class);
@Around("@annotation(com.example.annotations.LogApi)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object proceed = joinPoint.proceed();
long executionTime = System.currentTimeMillis() - start;
logger.info("{} executed in {}ms", joinPoint.getSignature(), executionTime);
return proceed;
}
}
```
这样就可以轻松地追踪哪些接口被调用了以及耗时情况如何。
---
### 总结
无论是采用 `@RestController` 还是单个方法上的 `@ResponseBody` 都能很好地满足 RESTful Web Service 开发需求;而借助于自定义注解与面向切面的技术,则可以让我们的程序更加灵活高效。
阅读全文
相关推荐

















