1. 程式人生 > 其它 >基於jackson 多型資料型別處理rest api 業務

基於jackson 多型資料型別處理rest api 業務

jackson 支援多型資料型別處理,基於此特性我們可以實現靈活強大的型別處理,業務規則處理
同時基於此可以實現動態外掛化的業務處理

參考使用

  • 抽象型別定義
    MyUser
 
package com.dalong;
 
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
 
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
@JsonAutoDetect(fieldVisibility= JsonAutoDetect.Visibility.PUBLIC_ONLY, getterVisibility= JsonAutoDetect.Visibility.NONE, isGetterVisibility= JsonAutoDetect.Visibility.NONE, setterVisibility= JsonAutoDetect.Visibility.NONE)
public abstract class MyUser<T> {
    public abstract String printVersion();
    public  String getType(){
        return this.getClass().getAnnotation(SourceType.class).value();
    }
    public abstract T instance();
}

SourceType 註解定義

package com.dalong;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface SourceType {
    String value();
    String label() default "";
    String uiConfig() default "";
    boolean configurable() default true;
    boolean listable() default true;
    boolean externalQuerySupported() default false;
}
  • 子類
    FirstMyUser
 
package com.dalong;
import java.util.UUID;
@SourceType(value ="FirstMyUser-dalongdemo")
public class FirstMyUser extends MyUser<FirstMyUser> {
    public String name;
    public String classType;
    @Override
    public String printVersion() {
        return UUID.randomUUID().toString();
    }
    @Override
    public FirstMyUser instance() {
        return this;
    }
}

SecondMyUser

package com.dalong;
import java.util.UUID;
@SourceType(value ="SecondMyUser-dalongdemoapp")
public class SecondMyUser extends MyUser<SecondMyUser> {
    public String name;
    public String classType;
 
    @Override
    public String printVersion() {
        return UUID.randomUUID().toString();
    }
 
    @Override
    public SecondMyUser instance() {
        return this;
    }
}
   
  • 使用
package com.dalong;
 
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.NamedType;
import java.lang.reflect.InvocationTargetException;
 
public class App {
   static   ObjectMapper objectMapper = new ObjectMapper();
    public static void main(String[] args) throws JsonProcessingException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        objectMapper.registerSubtypes(new NamedType(FirstMyUser.class, "dalongdemo"));
        objectMapper.registerSubtypes(new NamedType(SecondMyUser.class, "dalongdemoapp"));
        FirstMyUser bean = new FirstMyUser();
        bean.name="dalong";
        bean.classType="testapp";
        String s = objectMapper.writeValueAsString(bean);
        System.out.println(s);
        SecondMyUser bean2 = new SecondMyUser();
        bean2.name="dalong2";
        bean2.classType="testapp2";
        String s2 = objectMapper.writeValueAsString(bean2);
        System.out.println(s2);
        MyUser myUser=  objectMapper.readValue(s,MyUser.class);
        MyUser myUser2=  objectMapper.readValue(s2,MyUser.class);
        System.out.println(myUser.getType());
        System.out.println(myUser2.getType());
        Object ob= myUser2.instance();
        Object result = ob.getClass().getMethod("getType",null).invoke(ob,null);
        System.out.println(result.toString());
    }
}
  • 效果

 

 

說明

整合rest 的玩法,可以基於一個通用的rest 介面定義,基於不同的型別,使用如果類似的方法,同時整合上plugin 處理機制就可以靈活的控制業務資料處理了
參考如下示意整合模式

 

 

參考資料

https://www.baeldung.com/jackson-annotations
https://fasterxml.github.io/jackson-annotations/javadoc/2.4/com/fasterxml/jackson/annotation/JsonTypeInfo.html