gpt4 book ai didi

java - 使 JacksonMappingHttpMessageConverter 在 spring-mvc 中工作

转载 作者:行者123 更新时间:2023-11-29 05:52:38 25 4
gpt4 key购买 nike

我的 Controller 中有以下设置..

@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 对象类型也会产生相同的结果。似乎对长度有某种限制。

有人知道这是什么原因吗?尝试环顾四周,但找不到任何答案。

最佳答案

我相信 Jackson 对 RestTemplate 和 MVC(如果我记得的话它们使用相同的转换器)的支持将只适用于对象、集合和 map 。

因此你可能应该这样做:

@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...."}

那就是在数字和字符串等文字上使用对象、集合和映射。它也有意义因为: 35009407885329037222692932400074264446664226268195222640988625627173619843180772826752640648155658799270372119234187629 050497137538302947546084412123258622791317379619195119704289565629830377724917794555037569988459497730313689233302975859686 267399384697245615527172343209509485939175171493965805529700785110556843854914898462884448966246625644382452814404940244967 8472642642

不是有效的 JSON。它似乎适用于 MVC 的原因是与 Jackson 不同的 Converter 正在执行转换。

您还应该知道 BigInteger 通常在 JSON 中不受支持(无论它是否在对象中)。我很确定 Jackson 会将其转换为字符串,但您也应该知道这一点。

我不会将 BigInteger 用作 token (如果这就是您使用它的目的),而是使用 base64 编码的字符串,它会更小并且可能更安全。

关于java - 使 JacksonMappingHttpMessageConverter 在 spring-mvc 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13345886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com