Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC、JSON、字符串字段的错误序列化,长度超过1000个字符_Java_Json_Spring_Spring Mvc_Jackson - Fatal编程技术网

Java Spring MVC、JSON、字符串字段的错误序列化,长度超过1000个字符

Java Spring MVC、JSON、字符串字段的错误序列化,长度超过1000个字符,java,json,spring,spring-mvc,jackson,Java,Json,Spring,Spring Mvc,Jackson,我尝试通过注解@ResponseBody将实体列表作为JSON数据从服务器发送到客户端。问题是长度超过1000的文本字段序列化错误。在这种情况下,字符串在空符号“\u0000”序列上重放 我配置JSON映射器: @Configuration @EnableWebMvc @EnableScheduling @ComponentScan({"configs", "controllers", "services", "models"}) public class WebConfig { @Be

我尝试通过注解@ResponseBody将实体列表作为JSON数据从服务器发送到客户端。问题是长度超过1000的文本字段序列化错误。在这种情况下,字符串在空符号“\u0000”序列上重放

我配置JSON映射器:

@Configuration
@EnableWebMvc
@EnableScheduling
@ComponentScan({"configs", "controllers", "services", "models"})
public class WebConfig
{
    @Bean RequestMappingHandlerAdapter requestMappingHandlerAdapter()
    {
        RequestMappingHandlerAdapter reqMapHAdapter=new RequestMappingHandlerAdapter();

        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.indentOutput(true);
        MappingJackson2HttpMessageConverter httpMsgConv=new MappingJackson2HttpMessageConverter(builder.build());
        httpMsgConv.setPrettyPrint(true);

        ArrayList<MediaType> mediaTypes=new ArrayList<>();
        mediaTypes.add(new MediaType("application", "json", StandardCharsets.UTF_8));
        httpMsgConv.setSupportedMediaTypes(mediaTypes);

        ArrayList<HttpMessageConverter<?>> msgConvs=new ArrayList<>();
        msgConvs.add(httpMsgConv);

        reqMapHAdapter.setMessageConverters(msgConvs);
        return reqMapHAdapter;
    }
    ...
}
和结果,如果text.length()1000(我从消息中剪切了很大一部分“\u0000”):

尽管如此,手动调用ObjectMapper.writeValueAsString按预期工作,并序列化长度通常超过1000个字符的文本字段

有什么想法,如何解决这个问题

添加:测试控制器的方法:

@RequestMapping(value={"/testJsonConv"}, method=RequestMethod.GET)
@ResponseBody MessageViewItem testJsonConv()
{
    MessageViewItem msgViewItem=new MessageViewItem();
    msgViewItem.setText("Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat voluptatem. ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur?Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo");      
    return msgViewItem;
}
结果(切割大部分“\u0000”):


我认为有两种可能的解决办法:

  • 使用显式转换为JSON,如下所示:

    @控制器 公共类MyController { @自动连线对象映射器

    // manually convert you'r data to JSON string, and send as text
    @RequestMapping(value={GET_MESSAGES_URL}, 
        method=RequestMethod.GET, produces=MediaType.TEXT_PLAIN) throws ...
    @ResponseBody String getMessages()
    {
        // getting List<MesssageViewItem>
        List<MessageViewItem> messages=...;
        return mapper.writeValueAsString(messages);
    }
    
    //手动将数据转换为JSON字符串,并以文本形式发送
    @RequestMapping(值={GET_MESSAGES_URL},
    method=RequestMethod.GET,products=MediaType.TEXT(纯文本)抛出。。。
    @ResponseBody字符串getMessages()
    {
    //获取列表
    列表消息=。。。;
    返回mapper.writeValueAsString(消息);
    }
    
    }

  • 不要忘记为文本媒体类型添加消息转换器:

    @Configuration
    @EnableScheduling
    @EnableAsync
    @ComponentScan({"configs", "models"})
    public class WebConfig 
    {
        @Bean RequestMappingHandlerAdapter requestMappingHandlerAdapter()
        {
            RequestMappingHandlerAdapter reqMapHAdapter=new RequestMappingHandlerAdapter();
    
            ArrayList<HttpMessageConverter<?>> msgConvs=new ArrayList<>();
    
            StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
            stringConverter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_PLAIN));
            msgConvs.add(stringConverter);
    
            reqMapHAdapter.setMessageConverters(msgConvs);
            return reqMapHAdapter;
        }
    
        ...
    }
    
    @配置
    @使能调度
    @使能同步
    @组件扫描({“配置”、“模型”})
    公共类网络配置
    {
    @Bean RequestMappingHandlerAdapter RequestMappingHandlerAdapter()
    {
    RequestMappingHandlerAdapter reqMapHAdapter=新的RequestMappingHandlerAdapter();
    
    ArrayList问题不在于文本长度。尝试在
    text
    字段中硬编码一个超过1000个字符的长字符串,然后检查结果并在此处发帖。我在主帖子中添加了结果。或者你不是故意的?对我来说,不必担心…你在配置文件中做了什么吗?我还认为我在配置中遇到的问题持续时间,因为手动注入的RequestMappingHandlerAdapter会生成正确的JSON。但我不知道从何处查找问题。我找到了一个非优雅但有效的解决方案:手动将数据转换为JSON字符串,并使用StringHttpMessageConverter返回。如果一段时间后找不到完整的解决方案,请将此作为答案通知。@NokolayRusev,谢谢谢谢你的帮助。
    [ {
      "text" : " : \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000
    \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
      "localizedSendingDate" : "3 hour ago",
      "author" : {
        "viewName" : "John Doe",
        "imageUrl" : "/test_web_spring/images/usersImages/0/0/4.jpg",
        "id" : 940
      },
      "messageId" : 3812
    } ]
    
    @RequestMapping(value={"/testJsonConv"}, method=RequestMethod.GET)
    @ResponseBody MessageViewItem testJsonConv()
    {
        MessageViewItem msgViewItem=new MessageViewItem();
        msgViewItem.setText("Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat voluptatem. ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur?Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo");      
        return msgViewItem;
    }
    
    {
      "text" : " : \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
      "localizedSendingDate" : null,
      "author" : null,
      "messageId" : null
    }
    
    // manually convert you'r data to JSON string, and send as text
    @RequestMapping(value={GET_MESSAGES_URL}, 
        method=RequestMethod.GET, produces=MediaType.TEXT_PLAIN) throws ...
    @ResponseBody String getMessages()
    {
        // getting List<MesssageViewItem>
        List<MessageViewItem> messages=...;
        return mapper.writeValueAsString(messages);
    }
    
    @Configuration
    @EnableScheduling
    @EnableAsync
    @ComponentScan({"configs", "models"})
    public class WebConfig 
    {
        @Bean RequestMappingHandlerAdapter requestMappingHandlerAdapter()
        {
            RequestMappingHandlerAdapter reqMapHAdapter=new RequestMappingHandlerAdapter();
    
            ArrayList<HttpMessageConverter<?>> msgConvs=new ArrayList<>();
    
            StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
            stringConverter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_PLAIN));
            msgConvs.add(stringConverter);
    
            reqMapHAdapter.setMessageConverters(msgConvs);
            return reqMapHAdapter;
        }
    
        ...
    }