java - Spring 与 JSON 前缀配置有关的问题

标签 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

我已经包含了<mvc:annotation-driven />在我的 spring-servlet.xml 中,我们是否有任何其他手动方法可以在旧版本的 Jackson(例如 Jackson 1.6)中添加前缀?

更新:

Jackson 2.0 解决了这个问题,我可以在浏览器中查看前缀,但是我无法看到 Angular 端的输出。

我的配置是这样的:

<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 无法识别输出并且无法从该对象读取值。任何帮助都会非常好。提前致谢。

最佳答案

I'm perplexed with this output, besides Angular is not recognizing the output and not able to read the values from this object. Any help would be greatful.

该问题与 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>

前缀是字符串 )]}',\n 而不是 )]}', + 新行。 因此,我使用的一种解决方法是创建一个类(即 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 行的 Angular 进行正确的 JSON 序列化/反序列化,第一个用于 )]}', 字符,第二个字符用于 JSON 本身,这样 Angular 就能完美工作

一行 JSON 响应

1 )]}',\n["id":1,"name":"Marco"....]

两行 JSON 响应

1 )]}',
2 ["id":1,"name":"Marco"....]
  • AngularJS 版本。 1.5.9
  • Spring MVC 版本。 4.2.8

希望这有帮助

关于java - Spring 与 JSON 前缀配置有关的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32327638/

相关文章:

java - Android Socket 编程 Socket 从不连接

java - JPA 错误后从 PostgreSQL 连接关闭中恢复

java - 如果 JUnit 覆盖率低于特定阈值,如何使 Maven 构建失败

java - JodaTime LocalDate/LocalTime 不使用自定义 JSON 序列化程序类进行解析

jquery - Angular JS : html table columns ordering not working

javascript - ngOptions 创造奇怪的值(value)结果

javascript - AngularJS 如何将数据从子 Controller 发送到父 Controller ?

java - 在 Eclipse 中,如何更改类/类型模板中的默认修饰符?

python - Django Rest Framework - JSON Post 请求 ManyTomany 字段问题

angularjs - 布局函数应该位于 Angular 应用程序中的什么位置?