1

コントローラに次の設定があります。

@RequestMapping(value="/security_param", method=RequestMethod.GET)
    public @ResponseBody BigInteger getSecurityParam(){
        return result.getBigInteger();
    }

したがって、ブラウザに入力して応答を確認すると、次のようになります。

350094078853290372226929324000742644466642262681952226409886256271736198431807728267526406481556587992703721192341876290504971375383029475460844121232586227913173796191951197042895656298303777249177945550375699884594977303136892333029758596862673993846972456155271723432095094859391751714939658055297007851105568438549148984628844489662466256443824528144049402449678472642642...truncated

私のRestTemplate側では、次のJacksonMappingHttpMessageConverterような設定がありました。

CommonsClientHttpRequestFactory factory =  new CommonsClientHttpRequestFactory(commonsClient);

        RestTemplate httpClient2 = new RestTemplate(factory);
        List<HttpMessageConverter<?>> converters = new ArrayList();
        converters.add(new MappingJacksonHttpMessageConverter());
        httpClient2.setMessageConverters(converters);

        URL serverDomainUrl = new URL("http://127.0.0.1:8080");
        String urlPath = new URL(serverDomainUrl, "/trusted_server/security_param").toString();

        BigInteger xx = httpClient2.getForObject(urlPath, BigInteger.class);

どういうわけか、逆シリアル化がうまく機能せず、次のエラーが発生しました。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 200
    at org.codehaus.jackson.impl.Utf8StreamParser.parseNumberText(Utf8StreamParser.java:531)
    at org.codehaus.jackson.impl.Utf8StreamParser._nextTokenNotInObject(Utf8StreamParser.java:435)
    at org.codehaus.jackson.impl.Utf8StreamParser.nextToken(Utf8StreamParser.java:323)
    at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2439)
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2396)
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1662)
    at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.java:135)
    at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:154)
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:74)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:446)

Stringオブジェクトタイプを強制しようとしても、同じ結果が得られます。長さになんらかの制限があるようです。

誰かがこれの理由を知っていますか?周りを見回してみましたが、答えが見つかりませんでした。

4

1 に答える 1

3

RestTemplateとMVC(思い出すと同じコンバーターを使用)の両方に対するJacksonのサポートは、オブジェクト、コレクション、およびマップでのみ機能すると思います。

したがって、おそらく次のようなことを行う必要があります。

@RequestMapping(value="/security_param", method=RequestMethod.GET)
public @ResponseBody Map<String,Object> getSecurityParam(){
    Map<String,Object> m = new LinkedHashMap<String,Object>();
    m.put("token", result.getBigInteger().toString());
    return m;
}

これは次のような応答を返します:

{"token" : "350094078853290372226929324000...."}

つまり、オブジェクト、コレクション、およびマップを、数値や文字列などのリテラルに使用します。また、次の理由 で意味があります。350094078853290372226929324000742644466642262681952226409886256271736198431807728267526406481556587992703721192341876290504971375383029475460844121232586227913173796191951197042895656298303777249177945550375699884594977303136892333029758596862673993846972456155271723432095094859391751714939658055297007851105568438549148984628844489662466256443824528144049402449678472642642

有効なJSONではありません。MVCで機能するように見える理由はConverter、Jacksonのものとは異なるものが変換を行っているためです。

また、BigIntegerはJSONでは一般的にサポートされていないことも知っておく必要があります(オブジェクト内であるかどうかは関係ありません)。ジャクソンがそれを文字列に変換すると確信していますが、それにも注意する必要があります。

トークンにBigIntegerを使用しません(それを使用する場合)が、代わりに、より小さく、おそらくより安全なbase64エンコード文字列を使用します。

于 2012-11-12T15:01:19.083 に答える