为什么 Jackson 搞乱了应用程序/javascript 的解析?



所以我有这个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({});
....)

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

@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解析版本......

谢谢!

我将该JS文件的内容返回给API消费者的方式

因为你的javascript在文件中而不是动态的,你为什么不去弹簧的标准来公开资源呢?

在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

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

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

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

最新更新