我正在配置我的Spring项目以添加JSON前缀)]}',\n
以克服常见漏洞。我尝试配置每this link,它在启动服务器时导致异常。请帮我解决这个问题。
@Configuration
@EnableWebMvc
public Class WebAppConfig extends WebMvcConfigurationSupport
{
public void addPrefixJSON()
{
List<HttpMessageConverter<?>> converters = super.getMessageConverters();
MappingJackson2HttpMessageConverter convert = new MappingJackson2HttpMessageConverter();
convert.setPrefixJson(true);
converters.add(convert);
}
}
我正在接受以下例外,
08:01:23,435 ERROR [org.springframework.web.context.ContextLoader]
(ServerService Thread Pool -- 68) Context initialization failed:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource
[org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration.class]: Instantiation of bean failed; nested exception is
org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.requestMappingHandlerMapping()] threw exception; nested exception is
java.lang.ClassCastException: org.springframework.web.accept.ContentNegotiationManagerFactoryBean$$EnhancerByCGLIB$$6af53d42 cannot be cast to
org.springframework.web.accept.ContentNegotiationManager
我在我的spring-servlet.xml中包含了<mvc:annotation-driven />
我们还有其他任何手动方法可以在Jackson的旧版本中添加前缀,比如Jackson 1.6吗?
更新
Jackson 2.0解决了这个问题,我可以在浏览器中查看前缀,但是我无法看到角度端的输出。
我的配置如下:
<mvc:annotation-driven content-negotiation-manager="contentManager">
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="jsonPrefix" value=")]}',\n" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
,JSON输出
)]}',\n"{\"userName\":\"ABC\",\"emailId\":\"ABC@gmail.com\"}"
我对此输出感到困惑,除了Angular无法识别输出并且无法读取此对象的值。任何帮助都会很棒。提前致谢。
答案 0 :(得分:1)
在Spring Lemon中,只需配置如下所示的bean,而不是上面的配置:
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setJsonPrefix(")]}',\n");
return converter;
}
验证其是否正常工作的一种简单方法是查看响应数据,例如:在chrome。
中的网络标签中答案 1 :(得分:1)
我对这个输出感到困惑,除了Angular没有认识到 输出并且无法读取此对象的值。任何帮助 会很棒的。
问题与Spring xml配置有关:似乎某些字符被转义(可能是\ n被转义),所以如果你使用
<mvc:annotation-driven content-negotiation-manager="contentManager">
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="jsonPrefix" value=")]}',\n" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
前缀是字符串)]}&#39;,\ n 而不是)]}&#39;, +新行。 所以我使用的解决方法是创建一个类(即CustomMappingJackson2HttpMessageConverter),它扩展原始的org.springframework.http.converter.json.MappingJackson2HttpMessageConverter并覆盖方法setJsonPrefix,如下所示:
public class CustomMappingJackson2HttpMessageConverter
extends org.springframework.http.converter.json.MappingJackson2HttpMessageConverter {
public CustomMappingJackson2HttpMessageConverter() {
super();
}
public CustomMappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
super(objectMapper);
}
@Override
public void setJsonPrefix(String jsonPrefix) {
super.setJsonPrefix(jsonPrefix+"\n");
}
}
我的配置是:
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="mypackage.CustomMappingJackson2HttpMessageConverter">
<property name="jsonPrefix" value=")]}'," />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
通过这种方式,您可以将配置保留在xml文件中,并允许对需要2行的角度进行正确的JSON序列化/反序列化,第一个用于)}}&# 39;,字符和JSON本身的第二个字符,这样Angular完美地工作
一行中的JSON响应
1 )]}',\n["id":1,"name":"Marco"....]
两行中的JSON响应
1 )]}',
2 ["id":1,"name":"Marco"....]
希望这会有所帮助
答案 2 :(得分:1)
您可以XML encode换行符允许纯粹以XML格式配置。
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="jsonPrefix" value=")]}', " />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>