Spring配置JSON前缀问题

时间:2015-09-01 09:08:00

标签: java json angularjs spring spring-mvc

我正在配置我的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无法识别输出并且无法读取此对象的值。任何帮助都会很棒。提前致谢。

3 个答案:

答案 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"....]
  • AngularJS ver。 1.5.9
  • Spring MVC ver。 4.2.8

希望这会有所帮助

答案 2 :(得分:1)

您可以XML encode换行符允许纯粹以XML格式配置。

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="jsonPrefix" value=")]}',&#10;" />
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>