【问题标题】:Why is Jackson messing with the parsing of application/javascript?为什么杰克逊搞乱了应用程序/javascript的解析?
【发布时间】:2017-08-17 13:08:31
【问题描述】:

所以我有这个 RESTful Spring Boot API,它从文件系统中读取一个 JS 文件并公开这个文件的内容。目前,这就是我将该 JS 文件的内容返回给 API 使用者的方式:

return ResponseEntity.ok().header("Content-Type", "application/javascript").body(jsText) // jsText is a String variable

这是(部分)API 使用者看到的:

(function (w, d, s, l, i) {
    w[l] = w[l] || [];
    w[l].push({});
 ....)

现在我正在开发一个完全不相关的功能,需要我引入一个配置类来配置 java.time 类的 Jackson 序列化:

@Configuration
class WebConfig extends WebMvcConfigurerAdapter {

    private final static String DATE_TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss'Z'"

    @Autowired
    private ObjectMapper objectMapper

    @Override
    void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter()
        DateFormat dateFormat = new SimpleDateFormat(DATE_TIME_PATTERN, Locale.default)

        objectMapper.setDateFormat(dateFormat)
        objectMapper.registerModule(new JavaTimeModule())

        jacksonConverter.setObjectMapper(objectMapper)
        converters.add(jacksonConverter)

        super.configureMessageConverters(converters)
    }
}

这就是我的问题开始的地方。一旦我添加了converters.add(jacksonConverter) 行,来自同一端点的响应就变成了这样:

"(function (w, d, s, l, i) {\n  w[l] = w[l] || [];\n  w[l].push({});\n..."

(注意其中的" 和\n 字符)

现在,我在这里做错了什么?如果我查看响应标头,更改后它仍然显示application/javascript,但是为什么内容会更改?

我能以某种方式避免/解决这个问题吗?我的意思是,我仍然需要关于 JavaTimeModule 的部分,但希望避免破坏 API 使用者(他们无法解析带有 " 和 \n 的版本...)

谢谢!

【问题讨论】:

    标签: java json spring jackson


    【解决方案1】:

    是我如何将该 JS 文件的内容返回给 API 使用者

    既然你的 javascript 在文件中而不是动态的为什么不去标准的 spring 来公开资源呢?

    在您的 WebConfiguration(扩展 WebMvcConfigurerAdapter 的类)中覆盖 addResourceHandlers 方法

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry)   {
        registry.addResourceHandler("/javascript/**").addResourceLocations("classpath:/static/"); 
    } 
    

    然后,您只需将文件放在 src/main/resources/static 下并请求您的文件,假设您的文件名为 script.js 并且您在 localhsot:8080 上运行您的服务器,请求将是

    http://localhost:8080/javascript/script.js
    

    【讨论】:

    • 这其实是个好主意!感谢您的洞察力,我喜欢它!
    • 如果这能解决您的问题,请随时\接受答案
    【解决方案2】:

    我设法通过application.yml上的配置项修复它:

    spring:
      jackson:
        date-format: "yyyy-MM-dd'T'HH:mm:ss'Z'"
        serialization:
          write_dates_as_timestamps: false
    

    有了这些配置,我删除了WebConfig 类,一切正常:JS 渲染和java.time 格式都按预期工作。

    【讨论】:

      猜你喜欢
      • 2012-09-11
      • 2015-09-27
      • 2014-08-22
      • 2019-11-25
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      相关资源
      最近更新 更多