1

Web アプリケーションで spring 3.0 を使用しています。最近、アプリケーションで問題が発生しました。spring-servlet.xml ファイルでタグを使用<mvc:annotation-drive/>していますが、要件により、これを削除して代わりに XML 構成を配置する必要があります。

しかし、今私の問題は、出力に返された場合のように、フィールド名が引用された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>

どんな助けでもかなりの価値があります。

4

4 に答える 4

0

真と偽の値はJacksonライブラリにハードコーディングされていると思います(ボックス化されたブール値に対しても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;
}

そのため、Jacksonは、フィールド値で二重引用符で囲まれた「true」を返すことはありません(たとえば、コーデックでその動作が大幅にオーバーライドされていない場合)。

したがって、MappingJacksonHttpMessageConverterメソッドが呼び出されており、変換が他の場所で実行されていないことを確認してください。

于 2012-10-23T23:06:11.383 に答える
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;
     }
}
于 2012-10-25T08:40:27.177 に答える
0

のプリミティブ値だけを返すとどうなりますか(trueまたはBoolean.TRUE.booleanValue()のラップされたオブジェクト バージョンではなく)Boolean.TRUE

于 2012-10-20T17:38:38.483 に答える
0

FlexJSONプラグインを使用している場合は、JSON のカスタム出力を作成できます。ジャクソンでもできると思いますが、私はやったことはありません。FlexJSON サイトにはたくさんの例があります。

于 2012-10-18T13:57:32.093 に答える