Spring @RestController 不返回纯文本响应

作者:编程家 分类: spring 时间:2025-07-25

使用Spring框架构建RESTful API是开发者常用的方式之一。在Spring中,我们可以使用@RestController注解来标记一个类,使其成为一个RESTful API的控制器。这样,我们就可以方便地处理HTTP请求,并返回相应的响应。然而,默认情况下,@RestController注解返回的是JSON格式的数据,而不是纯文本响应。那么,如果我们想要返回纯文本响应怎么办呢?本文将介绍如何在Spring中实现这一需求,并给出相应的案例代码。

首先,我们需要明确一点,@RestController注解是@Controller和@ResponseBody注解的组合,它的作用是将Controller类中的方法返回的对象直接转换为JSON格式的数据,然后通过HTTP响应返回给客户端。而我们要实现返回纯文本响应的功能,就需要修改默认的转换方式。

为了实现这一功能,我们可以使用Spring提供的HttpMessageConverter接口。HttpMessageConverter接口定义了如何将HTTP请求和响应的消息体转换为Java对象,以及如何将Java对象转换为HTTP响应的消息体。Spring框架提供了许多默认的HttpMessageConverter实现,其中包括用于处理JSON格式数据的MappingJackson2HttpMessageConverter。

为了返回纯文本响应,我们可以自定义一个HttpMessageConverter的实现类。具体步骤如下:

1. 创建一个类,实现HttpMessageConverter接口,并重写其中的方法。在这个类中,我们需要指定该Converter支持的媒体类型(即Content-Type),以及如何将Java对象转换为纯文本字符串。

2. 在Spring的配置类中,将自定义的HttpMessageConverter添加到RequestMappingHandlerAdapter中的messageConverters属性中。

下面是一个简单的示例代码,演示如何使用自定义的HttpMessageConverter返回纯文本响应:

java

import org.springframework.http.HttpHeaders;

import org.springframework.http.HttpOutputMessage;

import org.springframework.http.MediaType;

import org.springframework.http.converter.HttpMessageConverter;

import org.springframework.http.converter.HttpMessageNotWritableException;

import java.io.IOException;

import java.nio.charset.Charset;

import java.util.Arrays;

import java.util.List;

public class TextPlainHttpMessageConverter implements HttpMessageConverter {

@Override

public boolean canRead(Class clazz, MediaType mediaType) {

return false;

}

@Override

public boolean canWrite(Class clazz, MediaType mediaType) {

return mediaType != null && mediaType.isCompatibleWith(MediaType.TEXT_PLAIN);

}

@Override

public List getSupportedMediaTypes() {

return Arrays.asList(MediaType.TEXT_PLAIN, MediaType.ALL);

}

@Override

public String read(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {

throw new UnsupportedOperationException("TextPlainHttpMessageConverter does not support reading.");

}

@Override

public void write(String s, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {

if (contentType == null) {

contentType = MediaType.TEXT_PLAIN;

}

HttpHeaders headers = outputMessage.getHeaders();

headers.setContentType(contentType);

Charset charset = Charset.forName("UTF-8");

headers.setAcceptCharset(Arrays.asList(charset));

outputMessage.getBody().write(s.getBytes(charset));

}

}

在上面的代码中,我们创建了一个名为TextPlainHttpMessageConverter的类,该类实现了HttpMessageConverter接口,并重写了其中的方法。在write方法中,我们将Java对象转换为纯文本字符串,并设置相应的响应头信息。

接下来,我们需要将自定义的HttpMessageConverter添加到RequestMappingHandlerAdapter中的messageConverters属性中。可以通过在Spring的配置类中添加如下代码实现:

java

@Configuration

public class WebConfig extends WebMvcConfigurerAdapter {

@Override

public void configureMessageConverters(List> converters) {

converters.add(new TextPlainHttpMessageConverter());

}

}

在上面的代码中,我们创建了一个名为WebConfig的配置类,并重写了其中的configureMessageConverters方法。在这个方法中,我们将自定义的HttpMessageConverter添加到converters列表中。

现在,我们已经完成了返回纯文本响应的配置。接下来,我们可以在@RestController注解的控制器类中使用自定义的HttpMessageConverter。例如:

java

@RestController

public class MyController {

@GetMapping("/text")

public String getText() {

return "This is a text response!";

}

}

在上面的代码中,我们创建了一个名为MyController的控制器类,并在其中定义了一个名为getText的GET请求处理方法。在这个方法中,我们直接返回一个字符串,这个字符串将被自定义的HttpMessageConverter转换为纯文本响应。

至此,我们已经完成了在Spring中返回纯文本响应的配置和使用。通过自定义HttpMessageConverter,我们可以灵活地处理不同类型的响应数据,并满足各种需求。希望本文对你有所帮助!