2012-10-13 52 views
1

我在我的web应用程序中使用spring 3.0。我的应用程序中最近出现了一个问题。我在我的spring-servlet.xml文件中使用了<mvc:annotation-drive/>标记,但由于要求,我必须删除它并放置XML配置。Spring MVC生成带引号的字段名称json输出

但现在我的问题是它生成带引号字段名称的json输出,如果我返回Boolean.TRUE我在输出中得到了"true"。我只想真正没有引号。

这里是我的XML配置

<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" /> 
    <bean id="pathMatcher" class="net.hrms.web.filters.CaseInsensitivePathMatcher" /> 

<bean name="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <property name="conversionService" ref="conversionService"></property> 
     </bean> 
    </property> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="byteArrayConverter"/> 
      <ref bean="jaxbConverter"/> 
      <ref bean="jsonHttpMessageConverter"/> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean> 
     </list> 
    </property> 
</bean> 
<bean name="byteArrayConverter" class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean> 
<bean name="jaxbConverter" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean> 
<bean name="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
    <property name="pathMatcher" ref="pathMatcher"></property> 
</bean> 

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/jsps/"/> 
    <property name="suffix" value=".jsp"/> 
    </bean> 

    <bean id="jsonHttpMessageConverter" 
     class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
    <property name="prefixJson" value="false"/> 
    <property name="supportedMediaTypes" value="application/json"/> 
    </bean> 

任何帮助将是非常可观的。

+0

能否请您确认这是默认的行为, - 你是不是从移开之前得到的报价'< mvc:annotation-driven />',在配置中似乎没有什么特别的地方可以做到这一点 –

+0

我很确定当我使用''我没有被引用的字段。但是现在我得到了引用的字段。我所有的jquery远程验证都会因此而失败, –

回答

0

如果您使用FlexJSON插件,则可以为JSON创建自定义输出。我相信你也可以在杰克逊那样做,但我从来没有这样做过。 FlexJSON网站上有大量示例。

+0

我没有使用FlexJSON。 –

+0

我会看看杰克逊的自定义串行器,然后,假设这是你正在使用的底层框架。或者,你可以同时使用两个,我已经完成了一些Spring Roo应用程序。关于定制的Jackson序列化程序的文章可以在这里找到:http://wiki.fasterxml.com/JacksonHowToCustomSerializers“ – CodeChimp

0

如果回到刚刚的true(或Boolean.TRUE.booleanValue()原始值,而不是Boolean.TRUE

+0

它仍然返回我引用的值'”true“' –

0

被包装的对象版本我相信真假值在杰克逊库硬编码(writeBoolean甚至呼吁,会发生什么盒装布尔):

private final static byte[] TRUE_BYTES = { 't', 'r', 'u', 'e' }; 

@Override 
public void writeBoolean(boolean state) 
    throws IOException, JsonGenerationException 
{ 
    _verifyValueWrite("write boolean value"); 
    if ((_outputTail + 5) >= _outputEnd) { 
     _flushBuffer(); 
    } 
    byte[] keyword = state ? TRUE_BYTES : FALSE_BYTES; 
    int len = keyword.length; 
    System.arraycopy(keyword, 0, _outputBuffer, _outputTail, len); 
    _outputTail += len; 
} 

所以杰克逊将永远不会返回双引号的“真”的字段值(如果它的行为没有被大量重写,例如使用的编解码器)

所以请检查MappingJacksonHttpMessageConverter方法正在被调用,转换不在别的地方执行。

+0

我没有做任何事情或者没有编解码器被使用。从我的spring-servlet.xml文件中删除''现在我得到了双引号true,即使所有的json响应都被转义了,我无法找到它发生的原因。 –

+0

@ZahidRiaz请在结果http响应中比较响应标头 - 它们是否相同? –

+0

@ ZahidRiaz你是否有任何拦截器或什么?它们不太可能会改变输出.. –

0

,如果你希望你的布尔值未加引号的使用JAXB ContextResolver

像这样的事情

import java.util.HashMap; 
import java.util.HashSet; 
import java.util.Map; 

import javax.ws.rs.ext.ContextResolver; 
import javax.ws.rs.ext.Provider; 
import javax.xml.bind.JAXBContext; 

import com.sun.jersey.api.json.JSONJAXBContext; 

@Provider 
public class JAXBContextResolver implements ContextResolver<JAXBContext> { 
    private JAXBContext context; 
    private Class[] types = {SomeClass.class}; //Add the classes processed by JAXB and exposing boolean properties 

    public JAXBContextResolver() throws Exception { 
     Map props = new HashMap<String, Object>(); 
     props.put(JSONJAXBContext.JSON_NOTATION, JSONJAXBContext.JSONNotation.MAPPED); 
     props.put(JSONJAXBContext.JSON_ROOT_UNWRAPPING, Boolean.TRUE); 

    java.util.HashSet<String> eprops = new HashSet<String>(); 
     eprops.add("someBooleanProperty"); //add properties you want unquoted 
     props.put(JSONJAXBContext.JSON_NON_STRINGS, eprops); 
     this.context = new JSONJAXBContext(types, props); 
    } 

    public JAXBContext getContext(Class<?> objectType) { 
     return (types[0].equals(objectType)) ? context : null; 
    } 
}