使用feign远程调用分页接口报错

当使用Feign进行远程调用遇到Mybatis-Plus的IPage分页数据无法传输时,可以尝试两种解决方案。方案一是将IPage改为Page对象进行传递;方案二是自定义IPage的反序列化器并注册到配置中。具体实现包括创建IPageDeserializer类以处理JSON序列化,并在WebDataConvertConfig配置类中加载该序列化器,确保分页信息能正确传输。
摘要由CSDN通过智能技术生成

如果使用my-batis-plus的IPge会传输不了数据

方案一

将IPage改成page

方案二

如果方案一不能解决问题 则需要实现 将分页信息序列化 加入相应的配置类
1 将page序列化:


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

import java.io.IOException;

/**
 * @author LvemiJ9
 * @create 2022-02-17 15:51
 */
public class IPageDeserializer extends StdDeserializer<IPage> {
   protected IPageDeserializer(Class<?> vc) {
      super(vc);
   }

   /**
    * Method that can be called to ask implementation to deserialize
    * JSON content into the value type this serializer handles.
    * Returned instance is to be constructed by method itself.
    * <p>
    * Pre-condition for this method is that the parser points to the
    * first event that is part of value to deserializer (and which
    * is never JSON 'null' literal, more on this below): for simple
    * types it may be the only value; and for structured types the
    * Object start marker or a FIELD_NAME.
    * </p>
    * <p>
    * The two possible input conditions for structured types result
    * from polymorphism via fields. In the ordinary case, Jackson
    * calls this method when it has encountered an OBJECT_START,
    * and the method implementation must advance to the next token to
    * see the first field name. If the application configures
    * polymorphism via a field, then the object looks like the following.
    * <pre>
    *      {
    *          "@class": "class name",
    *          ...
    *      }
    *  </pre>
    * Jackson consumes the two tokens (the <tt>@class</tt> field name
    * and its value) in order to learn the class and select the deserializer.
    * Thus, the stream is pointing to the FIELD_NAME for the first field
    * after the @class. Thus, if you want your method to work correctly
    * both with and without polymorphism, you must begin your method with:
    * <pre>
    *       if (p.getCurrentToken() == JsonToken.START_OBJECT) {
    *         p.nextToken();
    *       }
    *  </pre>
    * This results in the stream pointing to the field name, so that
    * the two conditions align.
    * <p>
    * Post-condition is that the parser will point to the last
    * event that is part of deserialized value (or in case deserialization
    * fails, event that was not recognized or usable, which may be
    * the same event as the one it pointed to upon call).
    * <p>
    * Note that this method is never called for JSON null literal,
    * and thus deserializers need (and should) not check for it.
    *
    * @param p    Parsed used for reading JSON content
    * @param ctxt Context that can be used to access information about
    *             this deserialization activity.
    * @return Deserialized value
    */
   @Override
   public IPage deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
      JsonNode node = p.getCodec().readTree(p);
      String s  = node.toString();
      ObjectMapper om = new ObjectMapper();
      Page page = om.readValue(s,Page.class);
      return page;
   }
}

2: 将其加载进配置中

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.util.Arrays;
import java.util.List;

/**
 * @author LvemiJ9
 * @create 2022-02-17 15:52
 */
@Configuration
public class WebDataConvertConfig extends WebMvcConfigurationSupport {
   @Override
   public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
      converters.add(mappingJackson2HttpMessageConverter());
      super.configureMessageConverters(converters);
   }

   @Bean
   public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
      MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
      ObjectMapper mapper = new ObjectMapper();
      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

      SimpleModule module = new SimpleModule();
      module.addDeserializer(IPage.class, new IPageDeserializer(IPage.class));
      mapper.registerModule(module);

      converter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON_UTF8,MediaType.APPLICATION_OCTET_STREAM));
      converter.setObjectMapper(mapper);

      return converter;
   }
}

然后再进行项目启动 运行 调用
如果上述;两个方案 未能解决问题 则需要实现自定义一个page类 但此方法本人未实现 后续有机会在补充
链接: link.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值