package com.star.msgconverter;
import java.io.IOException;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.ResolvableType;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.util.StreamUtils;
import org.springframework.util.TypeUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.star.model.User;
import com.star.output.OutputDto;
public class MessageConverter<T> extends MappingJackson2HttpMessageConverter {
private static final Logger logger = LoggerFactory.getLogger(MessageConverter.class);
private ObjectMapper jsonMapper = new ObjectMapper();
@Override
public Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
Class<?> targetClass = (type instanceof Class<?> ? (Class<?>) type : null);
if (targetClass == null) {
//获取type对应的可转换类型
ResolvableType resolvableType = ResolvableType.forType(type);
//Type对象转换为Class对象
targetClass = resolvableType.resolve();
}
logger.info("参数type:" + type.toString());
logger.info("参数contextClass:" + contextClass.toString());
logger.info("参数inputMessage:" + inputMessage.toString());
return readInternal(targetClass, inputMessage);
}
@Override
protected Object readInternal(Class<? extends Object> classzz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotWritableException {
if (TypeUtils.isAssignable(User.class, classzz) || TypeUtils.isAssignable(Map.class, classzz)) {
logger.info("自定义报文解析{}", classzz);
byte[] b = StreamUtils.copyToByteArray(inputMessage.getBody());
JsonNode master = jsonMapper.readTree(b);
JsonNode request = master.get("REQUEST");
if (request == null) {
logger.info("入参参数中缺少REQUEST节点,无法解析,请核对!");
}
else {
JsonNode data = request.get("REQUESTDATA");
JsonNode desc = request.get("REQUESTDESC");
if (data == null) {
logger.info("入参参数中缺少REQUESTDATA子节点,无法解析,请核对!");
}
else if(desc==null) {
logger.info("入参参数中缺少REQUESTDESC节点,无法解析,请核对!");
}
else {
try {
JSONObject jsonObject =JSONObject.parseObject(data.toString());
User user = jsonObject.toJavaObject(User.class);
logger.info("------入参报文------");
logger.info(JSON.toJSONString(jsonMapper.treeToValue(data, classzz)));
return jsonMapper.treeToValue(data, classzz);
} catch (com.fasterxml.jackson.databind.exc.InvalidFormatException e) {
logger.info("请求参数格式错误");
} catch (UnrecognizedPropertyException e) {
logger.info("请求中包含未能识别的业务参数名", e.getMessage());
} catch (JsonProcessingException e) {
logger.info("错误OpenAPI请求!");
} catch (Exception e) {
logger.info("请求参数格式有误!");
}
}
}
return null;
} else {
logger.info("进入默认报文解析{}", classzz);
return super.readInternal(classzz, inputMessage);
}
}
@Override
protected void writeInternal(Object object, Type type, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
if (TypeUtils.isAssignable(OutputDto.class, object.getClass())) {
OutputDto o = (OutputDto) object;
String str = JSON.toJSONString(o);
JSONObject json = JSONObject.parseObject(str);
Map<String,Object> returnMap = new HashMap<String,Object>();
Map<String,Object> map = new HashMap<String,Object>();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
map.put("RETURNDATA", o.getData());
map.put("RETURNCODE", o.getCode());
map.put("RETURNDESC", o.getMsg());
map.put("RETURNTIME",sf.format(new Date()));
returnMap.put("RESPONSE", map);
logger.info("------------------出参报文---------------");
logger.info(returnMap.toString());
super.writeInternal(returnMap, type, outputMessage);
} else {
super.writeInternal(object, type, outputMessage);
}
}
}
评论0
最新资源