为什么杰克逊搞乱应用程序/ javascript的解析?

时间:2017-08-17 13:08:32

标签: java json spring jackson

所以我有这个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解析版本...)

谢谢!

2 个答案:

答案 0 :(得分:0)

  

是我如何将该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上运行你的服务器,请求将是< / p>

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

答案 1 :(得分:0)

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

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

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