2012-10-13 95 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; 
    } 
}