当前位置: 首页 > 面试题库 >

使@ResponseBody注释的Spring(Boot)MVC控制器方法返回UTF-8

谭浩皛
2023-03-14
问题内容

我正在使用Spring Boot构建Spring
MVC服务,并希望能够将字符串返回为以UTF-8编码的纯文本格式。按照此描述,我认为唯一需要做的就是添加bean方法

@Bean
public HttpMessageConverter<String> responseBodyConverter() {
    StringHttpMessageConverter converter = new StringHttpMessageConverter();
    converter.setSupportedMediaTypes(Arrays.asList(new MediaType("text", "plain", Charset.forName("UTF-8"))));
    return converter;
}

但是root方法在

@Controller
public class RootController {

    @RequestMapping(value="/"/*, produces="text/plain;charset=UTF-8"*/)
    @ResponseBody
    public String root() {
        return "æøå";
    }

}

æøå除非我取消注释该produces部分,否则它会以ISO-8859-1(而不是UTF-8)的形式响应字符串,在这种情况下,它实际上返回UTF-8。消息转换器在这里似乎没有任何作用。

按照这种方法,我确认该bean实际上已经被注册。除了这个bean外,我还注册了另一个问题中所述的EmbeddedServletContainerFactory和,尽管我认为这与这里无关。CharacterEncodingFilter

有人可以解释注册的HttpMessageConverter实际作用,以及如何使带@ResponseBody注释的控制器方法无需produces每次都提供UTF-8
吗?

编辑

正如在评论中讨论的,接受的答案工作,我不得不升级春天启动的版本0.5.0.M60.5.0.BUILD- SNAPSHOT,并防止输出垃圾头,通话converter.setWriteAcceptCharset(false)StringHttpMessageConverter


问题答案:

的默认字符集StringHttpMessageConverterISO-8859-1。这意味着当客户端不请求特定的字符集时,ISO-8859-1将返回该字符集。

如果要UTF-8成为默认字符集,则将其传递给构造函数:

converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));

setSupportedMediaTypes()这样就不再需要text/plain; charset=default character set自动添加的呼叫。



 类似资料:
  • 我的控制器类如下: 我有以下资源服务器配置 最后,我的测试如下所示: 问题是我总是获得401 HTTP状态,并显示消息“unauthorized”,“error\u description”:“访问此资源需要完全身份验证”。 我应该如何为@PreAuthorated注释控制器方法方法编写测试?

  • 我得到这个错误消息: 无法写入JSON: 未找到用于java.io.FileDescriptor类的序列化程序,也未发现用于创建BeanSerializer的属性 (为了避免异常,禁用SerializationFeature.fail_on_empty_beans)) (通过引用链: org.springframework.core.io.filesystemResource[\“outputSt

  • 为什么我不能在这里回复一个糟糕的请求?在其他例子中,它工作得很好。

  • 我试图从xml配置转移到java配置。应用程序启动时不会出现任何错误,但是当内容不同时,jsp返回$END$。 我相信我在某个地方犯了一些愚蠢的错误,没有抛出异常 注意:使用xml配置时,一切正常 配置类 初始值设定项类 控制器

  • 问题内容: 有没有理由不将Controller映射为接口? 在所有的示例和问题中,我看到了周围的控制器,都是具体的类。是否有一个原因?我想将请求映射与实现分开。但是,当我尝试在具体类中获取a 作为参数时,我碰壁了。 我的Controller界面如下所示: And the implementing class: 该方法效果很好;在抛出一个异常 如果我将注释添加到具体类中,那么一切都会按预期工作,但是

  • 编辑:下面是LatherupApplication应用程序类: 下面是我家控制器: 下面是pom.xml文件: 下面是home.jsp: 应用程序.属性:

  • 我正在使用Spring3.1并编写了我的DAO和服务层(事务性)。 但是,在一个特殊情况下,为了避免惰性初始化异常,我必须创建一个spring mvc请求处理程序method@transactional。但无法将事务附加到该方法。方法名为ModelAndView home(HttpServletRequest request、HttpServletResponse response)。http:/

  • 使用Spring Boot 1.3.6. RELEASE,我正在尝试使用JUnit、Mockito和MockMvc对控制器方法进行单元测试。我已经构建了一个自定义约束验证器(扩展了ConstraintValidator),它可以自动构建服务。我的目标实体用自定义验证器注释和组进行注释。我的控制器方法签名如下: 在运行时,一切正常。 我想通过完全模拟我的自定义约束验证器,或者只是模拟验证器使用的ti