怎么使用纯注解配置并用@RestController注解返回json和xml格式的数据以及404错误和406错误怎么处理

本文介绍了如何在Spring MVC中使用@RestController注解返回JSON和XML格式的数据,包括所需的Maven依赖配置、Spring MVC配置类及初始化类的实现,并提供了一个示例Controller。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,我们都知道@RestController其实是一个组合注解,他是@Controller和@ResponseBody的
组合,他可以在控制器当中返回json和xml格式的数据,下面就让我们来看看具体的流程吧。
首先我们要导入maven依赖,这里我就全部贴上来了了。
<properties>
        <!-- Spring版本号 -->
        <spring.version>4.3.8.RELEASE</spring.version>
    </properties>
    <dependencies>
        <!-- Spring相关包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- AOP相关包 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.0</version>
        </dependency>

        <!-- MyBatis相关包 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.3.0</version>
        </dependency>
        <!-- MySQL相关包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.26</version>
        </dependency>
        <!-- 数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.20</version>
        </dependency>

        <!-- Spring集成MyBatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.3</version>
        </dependency>

        <!-- JSP标准标签库 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- 日志相关包 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.21</version>
        </dependency>

        <!-- 单元测试相关包 -->
        <!-- <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency> -->
        <dependency>
        	<groupId>org.springframework</groupId>
        	<artifactId>spring-beans</artifactId>
        	<version>${spring.version}</version>
        </dependency>
        <dependency>
        	<groupId>org.springframework</groupId>
        	<artifactId>spring-context</artifactId>
        	<version>${spring.version}</version>
        </dependency>
        <dependency>
        	<groupId>org.springframework</groupId>
        	<artifactId>spring-expression</artifactId>
        	<version>${spring.version}</version>
        </dependency>
        <dependency>
        	<groupId>org.springframework</groupId>
        	<artifactId>spring-orm</artifactId>
        	<version>3.2.8.RELEASE</version>
        </dependency>
        
        <!-- 加入Redis的依赖 -->
        <dependency>
        	<groupId>redis.clients</groupId>
        	<artifactId>jedis</artifactId>
        	<version>2.9.0</version>
        </dependency>
        <dependency>
    		<groupId>org.springframework.data</groupId>
    		<artifactId>spring-data-redis</artifactId>
    		<version>1.8.4.RELEASE</version>
		</dependency>
        <dependency>
        	<groupId>c3p0</groupId>
        	<artifactId>c3p0</artifactId>
        	<version>0.9.1.2</version>
        </dependency>
        <dependency>
        	<groupId>org.springframework</groupId>
        	<artifactId>spring-test</artifactId>
        	<version>${spring.version}</version>
        </dependency>
        <dependency>
        	<groupId>org.springframework</groupId>
        	<artifactId>spring-context-support</artifactId>
        	<version>${spring.version}</version>
        </dependency>
        
        <!-- 加入定时任务的quartz依赖 -->
        <dependency>
    		<groupId>org.quartz-scheduler</groupId>
    		<artifactId>quartz</artifactId>
    		<version>2.2.3</version>
		</dependency>
        <dependency>
        	<groupId>junit</groupId>
        	<artifactId>junit</artifactId>
        	<version>4.12</version>
        </dependency>

        <!-- 加入对json格式的支持 -->
        <dependency>
        	<groupId>com.fasterxml.jackson.core</groupId>
        	<artifactId>jackson-databind</artifactId>
        	<version>2.9.8</version>
        </dependency>
        <!-- 加入对xml格式的支持 -->
        <dependency>
        	<groupId>com.fasterxml.jackson.dataformat</groupId>
        	<artifactId>jackson-dataformat-xml</artifactId>
        	<version>2.5.3</version>
        	<!-- <type>bundle</type> -->
        </dependency>
    </dependencies>
其实并不需要这么多的依赖,但是我懒。。每次都直接复制粘贴,,然后就很长了。嘛。反正不会错
就对了。嘻嘻嘻。
然后,这个是我们工程结构,其实是很简单的,标准的maven结构。

然后因为我们是纯注解的配置,于是我们就需要配置一个解析器的类,其实他的作用就是代替spring-web.xml这个文件,他就配置了一个识图解析器,具体代码如下所示:

/**
 * 这是springmvc的配置类,用于取代springmvc.xml文件
 * 首先它属于一个配置类,那么就必须要有@Configuration注解
 * 然后需要开启webmvc的支持,就需要@EnableWebMvc注解,
 * 还有就是配置需要扫描的包@ComponentScan注解
 * @author 11366
 *
 */

@Configuration
@EnableWebMvc
@ComponentScan("com")
public class SpringMVCViewResolverConfig {

	@Bean
	public InternalResourceViewResolver viewResolver() {
		InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
		viewResolver.setPrefix("/WEB-INF/pages/");
		viewResolver.setSuffix(".jsp");
		viewResolver.setViewClass(JstlView.class);
		return viewResolver;
	}
}

然后我们还需要一个初始化的类,用来代替web.xml这个文件,具体代码如下所示:

public class WebInitializer implements WebApplicationInitializer {

	@Override
	public void onStartup(ServletContext servletContext) throws ServletException {
		// TODO Auto-generated method stub
		//web应用注解配置上下文
		AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
		//将视图解析器注册到上下文
		context.register(SpringMVCViewResolverConfig.class);
		//
		context.setServletContext(servletContext);
		Dynamic servlet=servletContext.addServlet("dispatcher", new DispatcherServlet(context));
		
		servlet.addMapping("/");
		//设置启动是就加载
		servlet.setLoadOnStartup(1);
	}

}

然后我们就可以欢快的去测试啦。。Controller代码如下:

@RequestMapping("/anno")*/
@RestController
@RequestMapping("/rest")
public class ResponseBodyTestController {
	
	//返回的是json类型
	@RequestMapping(value="/getJson",produces= {"application/json;charset=UTF-8"})
	public Account getJson(Account account) {
		return new Account(account.getId()+1,account.getName()+"陈思博","130248",300.0);
	}
	
	//返回单是xml类型
	//返回xml是有问题的。。原因是没有导入jackson-dataformat-xml这个依赖,加入后工程就ojbk了
	@RequestMapping(value="/getXml",produces= {"application/xml;charset=UTF-8"})
	public Account getXml(Account account) {
		return new Account(account.getId()+1,account.getName()+"陈思博","130248",300.0);
	}
	
	
}

不过这里有一个坑,最开始我没有加入jackson-dataformat-xml这个依赖,然后导致疯狂报406的错误。。找了好久的博客才看到,,之前还有一个坑就是我的这个是复制的上一个工程的环境,然后没有改properties里面的web project setting就导致一直找不到路径。凉凉
在这里插入图片描述
被404和406折磨了整整一下午。。哎,还是自己太菜了啊。写个博客来提醒一下自己吧。

<think>我们参考了用户提供的引用内容,特别是引用[1]中提到的使用Micrometer监控Spring Boot应用的指标,并将其发送到Prometheus并用Grafana展示。同时,引用[3]中提到了全链路压测性能看板的搭建。根据这些信息,我们将介绍如何使用Micrometer、PrometheusGrafana来监控Spring Boot接口的性能指标。 ### 步骤1:添加依赖 首先,在Spring Boot项目中添加MicrometerPrometheus的依赖。如果使用Maven,在`pom.xml`中添加以下依赖: ```xml <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ``` ### 步骤2:配置Actuator端点 在`application.properties`(或`application.yml`)中配置Actuator以暴露Prometheus端点: ```properties # 启用Prometheus端点 management.endpoints.web.exposure.include=health,info,prometheus # 设置Actuator端点的基本路径,默认为/actuator management.endpoints.web.base-path=/actuator # 开启指标收集 management.metrics.export.prometheus.enabled=true ``` ### 步骤3:自定义指标监控 Spring Boot自动收集了一些基本指标(如JVM内存、线程等)。为了监控接口的响应时间、错误吞吐量,我们可以使用Micrometer的`Timer``Counter`自定义指标。但更简单的方式是使用AOP来监控所有接口。 #### 方法1:使用内置的`TimedAspect` 添加Spring AOP依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 然后,配置一个`TimedAspect` Bean来监控所有Controller方法的执行时间: ```java import io.micrometer.core.aop.TimedAspect; import io.micrometer.core.instrument.MeterRegistry; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MetricsConfig { @Bean public TimedAspect timedAspect(MeterRegistry registry) { return new TimedAspect(registry); } } ``` 在Controller方法上添加`@Timed`注解来收集指标: ```java import io.micrometer.core.annotation.Timed; @RestController @RequestMapping("/sjwuliu") @Slf4j public class SuppliercenterController { @RequestMapping("/queryparameter") @Authentication(false) @Timed(value = "supplier.queryparameter", description = "Time taken to handle queryparameter request") public Object org(@RequestBody JSONObject json) throws Exception { // ... 原有逻辑 } } ``` #### 方法2:使用`MeterRegistry`手动记录 如果需要对特定逻辑进行更细致的监控,可以注入`MeterRegistry`手动记录: ```java import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Timer; @RestController @RequestMapping("/sjwuliu") @Slf4j public class SuppliercenterController { private final Timer requestTimer; private final Counter errorCounter; public SuppliercenterController(MeterRegistry registry) { requestTimer = Timer.builder("supplier.queryparameter.timer") .description("Time taken to handle queryparameter request") .register(registry); errorCounter = Counter.builder("supplier.queryparameter.errors") .description("Number of errors in queryparameter requests") .register(registry); } @RequestMapping("/queryparameter") @Authentication(false) public Object org(@RequestBody JSONObject json) throws Exception { // 使用Timer.Sample记录时间 Timer.Sample sample = Timer.start(); try { // 原有逻辑 // 参数验证 if (supplier == null || amount == null || amount.compareTo(BigDecimal.ZERO) <= 0) { errorCounter.increment(); // 记录错误 // ... 返回错误 } // ... 其他逻辑 return result; } catch (Exception e) { errorCounter.increment(); throw e; } finally { sample.stop(requestTimer); // 记录耗时 } } } ``` ### 步骤4:部署PrometheusGrafana 1. **下载并安装Prometheus**:从[Prometheus官网](https://prometheus.io/download/)下载,并配置`prometheus.yml`,添加Spring Boot应用的指标端点: ```yaml scrape_configs: - job_name: 'spring-boot' metrics_path: '/actuator/prometheus' static_configs: - targets: ['localhost:8080'] # 修改为应用的实际地址 ``` 启动Prometheus。 2. **下载并安装Grafana**:从[Grafana官网](https://grafana.com/grafana/download)下载,启动后添加Prometheus数据源。 ### 步骤5:在Grafana中创建监控看板 1. 添加数据源:选择Prometheus,并配置URL(如`http://localhost:9090`)。 2. 导入预制的Spring Boot监控面板: - 在Grafana中,点击"Create" -> "Import"。 - 输入Spring Boot面板的ID:`6756`(这是一个常用的Spring Boot监控面板)。 - 选择数据源为Prometheus,然后导入。 这个面板将展示包括接口响应时间(P99、P95、P50)、错误率、请求吞吐量(QPS)等关键指标。 ### 步骤6:监控告警(可选) 在Grafana中可以设置告警规则,例如当错误率超过5%时发送通知(邮件、Slack等)。 ### 效果评估 通过上述步骤,我们可以实时监控接口的性能指标。根据引用[3]中的优化案例,经过监控优化后,平均响应时间从320ms降至142ms(提升55.6%),吞吐量提升200%[^3]。同时,通过Grafana看板,我们可以直观地看到优化前后的对比。 ### 相关问题 1. 如何优化Spring Boot应用以降低接口响应时间? 2. 如何使用Prometheus的告警功能? 3. 除了Prometheus,还有哪些监控Spring Boot应用的方案?</think>### 使用监控工具跟踪Spring Boot接口性能指标指南 根据引用内容,我将通过 **Micrometer + Prometheus + Grafana** 方案实现接口性能监控(参考引用[1][^1]引用[3][^3])。以下是具体实施步骤: --- #### 第一步:集成监控依赖 在`pom.xml`添加MicrometerPrometheus依赖: ```xml <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ``` --- #### 第二步:配置监控端点 在`application.properties`中开启监控端点: ```properties # 暴露Prometheus指标端点 management.endpoints.web.exposure.include=health,metrics,prometheus # 启用HTTP请求监控 management.metrics.web.server.auto-time-requests=true ``` --- #### 第三步:自定义接口监控(关键) 在控制器中添加细粒度指标追踪: ```java import io.micrometer.core.instrument.*; @RestController @RequestMapping("/sjwuliu") public class SuppliercenterController { // 声明监控指标 private final Counter requestCounter; private final Timer responseTimer; public SuppliercenterController(MeterRegistry registry) { // 请求计数器(记录总请求数错误数) requestCounter = Counter.builder("api.requests") .tag("endpoint", "/queryparameter") .register(registry); // 响应时间计时器 responseTimer = Timer.builder("api.response.time") .publishPercentiles(0.5, 0.95, 0.99) // 50%, 95%, 99%分位 .register(registry); } @RequestMapping("/queryparameter") public Object org(@RequestBody JSONObject json) { requestCounter.increment(); // 记录请求 return responseTimer.record(() -> { try { // 业务逻辑... return result; } catch (Exception e) { // 记录错误(标签区分) requestCounter.increment(1.0, Tag.of("status", "error")); throw e; } }); } } ``` --- #### 第四步:部署监控系统 1. **Prometheus配置**(`prometheus.yml`): ```yaml scrape_configs: - job_name: 'spring-boot' metrics_path: '/actuator/prometheus' static_configs: - targets: ['your-app-host:8080'] # 应用地址 ``` 2. **Grafana仪表盘配置**: - 数据源选择Prometheus - 导入Spring Boot监控模板(ID:6756) - 关键监控面板: - **响应时间**:`histogram_quantile(0.99, sum(rate(api_response_time_seconds_bucket[1m])) by (le))` - **错误率**:`sum(rate(api_requests_total{status="error"}[1m])) / sum(rate(api_requests_total[1m]))` - **吞吐量**:`rate(api_requests_total[1m])` --- #### 第五步:分析监控数据 通过Grafana可实时查看: - **响应时间分布**:P50/P95/P99分位值(参考引用[3]优化案例[^3]) - **错误率趋势**:HTTP 5xx错误比例 - **吞吐量变化**:QPS(每秒请求数) - **黄金指标看板**: ```plaintext 延迟(Latency) = api_response_time_seconds 流量(Traffic) = api_requests_total 错误(Errors) = api_requests_total{status="error"} 饱度(Saturation) = 系统线程池使用率 ``` --- #### 优化效果验证 根据引用[3]的优化案例[^3],实施监控后典型改进: | 指标 | 优化前 | 优化后 | 提升幅度 | |--------------|--------|--------|----------| | 平均响应时间 | 320ms | 142ms | 55.6% | | 最大吞吐量 | 1200QPS| 3600QPS| 200% | | P99延迟 | 850ms | 210ms | 75% | --- ### 相关问题 1. 如何设置Spring Boot接口的熔断机制防止雪崩效应? 2. 如何通过JVM参数优化降低Spring Boot的GC停顿时间? 3. 在微服务架构中如何实现全链路性能监控? 4. 如何使用Grafana配置接口性能告警规则? > 通过此方案,您将获得实时可视化的接口性能数据,帮助快速定位瓶颈(如引用[2]指出响应时间直接影响用户留存率[^2])。建议每周分析性能报告,建立迭代准入标准(参考引用[3]的6.2.2节[^3])。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值