grails - Spring Boot 1.3 WebSocket JSON转换器产生无效的JSON

标签 grails spring-boot

升级到Spring Boot 1.3(通过Grails 3.1)后,JSON输出呈现不正确。我相信是因为new auto-configured WebSocket JSON converter

例如,对于Spring Boot的早期版本(通过Grails 3.0),请使用以下代码:

@MessageMapping("/chat")
@SendTo("/sub/chat")
protected String chatMessage() {
    def builder = new groovy.json.JsonBuilder()
    builder {
        type("message")
        text("foobar")
    }
    builder.toString()
}

这将产生:
{"type": "message", "text": "foobar"}

使用Spring Boot 1.3(通过Grails 3.1)时,该Web套接字会产生以下内容:
"{\"type\":\"message\",\"text\":\"foobar\"}"

这是无效的JSON。如何摆脱这种新行为,使其像以前一样呈现JSON?如果您有任何建议,请告诉我。

我尝试覆盖新的configureMessageConverters方法,但没有任何效果。

最佳答案

看起来你是对的。引用的提交显示可疑的自动配置imho。

特别是在过去的b / c中,转换器的顺序被有意地更改为StringMessageConverter优先于MappingJackson2MessageConverter:https://github.com/spring-projects/spring-framework/commit/670c216d3838807fef46cd28cc82165f9abaeb45

现在,您可以禁用该自动配置:

@EnableAutoConfiguration(exclude = [WebSocketMessagingAutoConfiguration])
class Application extends GrailsAutoConfiguration { ... }

或者,在已配置的转换器的顶部添加另一个StringMessageConverter(也许是因为您确实想要启动自动配置行为,因为它使用的是jackson ObjectMapper bean而不是创建新的Bean):
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    boolean configureMessageConverters(List<MessageConverter> messageConverters) {
        messageConverters.add 0, new StringMessageConverter()
        return true
    }

...

}

希望能有所帮助。

关于grails - Spring Boot 1.3 WebSocket JSON转换器产生无效的JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35318454/

相关文章:

intellij-idea - 在Intellij中运行应用程序无法编译域-但是bootRun可以工作

java - 如何在 Spring Boot Security 中使用户以前的 session 无效

java - 如何在 docker 镜像中的 Spring Boot 应用程序中禁用保持 Activity 状态

java - 使用 Vaadin 登录的 Spring Boot 安全性

spring - 设置负载均衡器和 HTTPS 后无法连接到站点?

grails - 在输入完成之前执行Geb单击

testing - 什么是复杂 Web 应用程序功能测试的最佳工具

grails - 在Grails Controller 中更新HasMany关系

grails - 标记Geb类别/测试以排除

spring-boot - Spring boot微服务架构中如何用Keycloak实现JWT?