注解将Java 对象转Apama的event

标签: Apama ApamaEvent 注解
14人阅读 评论(0) 收藏 举报
分类:

    项目中需要整合web框架和apama平台,用Apama提供的engineClient互相链接。在交互时将java类封装成event会非常麻烦,目前知道两种办法:

    1、拼接成字符串:将消息拼成字符串

String eventStr = "com.event.TestEvent('field1','field2','field3')";
Event event = new Event(eventStr);

    2、用Event类包装

EventType eventType = new EventType("com.event.TestEvent")
eventType.addField('field1name', StringFieldType.TYPE);
eventType.addField('field2name', StringFieldType.TYPE);
eventType.addField('field3name', StringFieldType.TYPE);

Event event = new Event(eventType);
event.setField('field1name', field1);
event.setField('field2name', field2);
event.setField('field3name', field3);

每一次交互都需要用这样的方法处理一遍,代码容易出错也不易维护,就用了注解方式处理

注解:EventField

package com.test.common.apama;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 用于标记变量在EVENT中的名称及类型
 * @Author: ZH
 * @Date: Created on 16:28 2018/3/13.
 */
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD})//次注解作用于类和字段上
public @interface EventField {
    /**
     * 获取名称
     * @return
     */
    String name() default "";
}

注解处理类ApamaUtils:

package com.test.common.apama;

import com.apama.event.Event;
import com.apama.event.parser.BooleanFieldType;
import com.apama.event.parser.DictionaryFieldType;
import com.apama.event.parser.EventType;
import com.apama.event.parser.FloatFieldType;
import com.apama.event.parser.IntegerFieldType;
import com.apama.event.parser.SequenceFieldType;
import com.apama.event.parser.StringFieldType;
import com.finesys.common.utils.StringUtils;

import java.lang.reflect.Field;

/**
 * APAMA工具类
 *
 * @Author: ZH
 * @Date: Created on 15:59 2018/3/13.
 */
public class ApamaUtils {
    /***
     * 根据类获取EventType-只能处理int、String、double、float、char、int[]、double[]、float[]、string[]、boolean[]、map<string,string>
     * @param packageName
     * @param clazz
     * @return
     */
    public static EventType getEventTypeByClass(String packageName, Class clazz) {
        EventField packageInfo = (EventField) clazz.getAnnotation(EventField.class);
        if (StringUtils.isEmpty(packageName) && packageInfo != null) {
            packageName = packageInfo.name();
        }
        if (StringUtils.isEmpty(packageName)) {
            throw new NullPointerException("未获取packageName");
        }
        EventType eventType = new EventType(packageName);
        Field[] fields = clazz.getDeclaredFields();
        if (fields != null && fields.length > 0) {
            for (Field field : fields) {
                //解析注解
                EventField fieldType = field.getAnnotation(EventField.class);
                if (fieldType == null) {
                    continue;
                }
                //string类型
                String simpleName = field.getType().getSimpleName();
                //获取变量名称
                String name = field.getName();
                if (StringUtils.isNotEmpty(fieldType.name())) {
                    name = fieldType.name();
                }
                if (simpleName.equals("String") || simpleName.equals("char")) {
                    eventType.addField(name, StringFieldType.TYPE);
                    continue;
                }
                //int类型
                if (simpleName.equals("int")) {
                    eventType.addField(name, IntegerFieldType.TYPE);
                    continue;
                }
                //double类型
                if (simpleName.equals("double") || simpleName.equals("float")) {
                    eventType.addField(name, FloatFieldType.TYPE);
                    continue;
                }
                //boolean类型
                if (simpleName.equals("boolean")) {
                    eventType.addField(name, BooleanFieldType.TYPE);
                    continue;
                }
                //String[]类型数组
                if (simpleName.equals("String[]") ) {
                    eventType.addField(name, new SequenceFieldType(StringFieldType.TYPE));
                    continue;
                }
                //int[]类型数组
                if (simpleName.equals("int[]") ) {
                    eventType.addField(name, new SequenceFieldType(IntegerFieldType.TYPE));
                    continue;
                }
                //double[]类型数组或者float[]类型
                if (simpleName.equals("double[]")||simpleName.equals("float[]") ) {
                    eventType.addField(name, new SequenceFieldType(FloatFieldType.TYPE));
                    continue;
                }
                //boolean[]类型数组
                if (simpleName.equals("boolean[]")||simpleName.equals("float[]") ) {
                    eventType.addField(name, new SequenceFieldType(BooleanFieldType.TYPE));
                    continue;
                }
                //map类型,只支持String\String类型
                if (simpleName.equals("Map") ) {
                    eventType.addField(name, new DictionaryFieldType(StringFieldType.TYPE,StringFieldType.TYPE));
                    continue;
                }

            }
        }
        return eventType;
    }

    public static Event getEventByObject(Object object) {
        return getEventByObject(null, object);
    }

    /**
     * 获取指定对象的Event
     * @param packageName
     * @param object
     * @return
     */
    public static Event getEventByObject(String packageName, Object object) {
        Event event = new Event(getEventTypeByClass(packageName,object.getClass()));
        Field[] fields = object.getClass().getDeclaredFields();
        if (fields != null && fields.length > 0) {
            for (Field field : fields) {
                //解析注解
                EventField eventField = field.getAnnotation(EventField.class);
                if (eventField == null) {
                    continue;
                }
                //修改权限
                boolean accessFlag = field.isAccessible();
                field.setAccessible(true);
                Object o;
                try {
                    //获取变量值
                    o = field.get(object);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                    continue;
                }
                String name = field.getName();
                if (StringUtils.isNotEmpty(eventField.name())) {
                    name = eventField.name();
                }
                if (StringUtils.isNotEmpty(name) && o != null) {
                    event.setField(name, o);
                }
                //还原权限
                field.setAccessible(accessFlag);
            }
        }
        return event;
    }
   @EventField(name = "com.text.Test")
   static class Test {
        @EventField(name = "String")
        public String StringName;
        @EventField
        public int intName;
        @EventField()
        private float floatName;
    }
}
在使用注解时变量声明顺序应该和event中顺序一致,否则赋值会混乱。考虑在注解中加一个排序字段。


    

查看评论

java通过注解将对象转换为xml

import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import j...
  • z278718149
  • z278718149
  • 2015-02-16 16:43:32
  • 1061

Java下利用Jackson进行JSON解析和序列化,注解应用

package org.outman.dms.server; import java.text.SimpleDateFormat; import com.fasterxml.jackson.dat...
  • luman1991
  • luman1991
  • 2017-02-08 19:02:17
  • 2735

event事件相关和window对象json字符串对象之间转换

阻止浏览器默认行为的兼容写法:event.preventDefault ? event.preventDefault() : (event.returnValue = false)阻止冒泡兼容写法:...
  • zp_love666
  • zp_love666
  • 2017-10-10 11:20:01
  • 244

Spring MVC中利用注解实现XML和Java对象之间的转换

在Spring MVC中,可以通过注解@RequestBody直接将输入的XML字符串转为Java对象,其底层实际上是通过JAXB来实现的。JAXB直接包含在JDK中,通过Demo了解使用:在Bean...
  • yy254117440
  • yy254117440
  • 2017-01-04 23:46:20
  • 2646

利用Xstream注解实现xml和java bean之间的转换

java 利用Xstream生成和解析xml,知识结构: 1.Xstream简介; 使用限制: JDK版本不能  虽然预处理注解是安全的,但自动侦查注解可能发生竞争条件. 特点:  ...
  • smshuxue
  • smshuxue
  • 2014-06-19 21:15:25
  • 2490

使用Java注解将实体类转化为sql字符串

首先是定义一个实体类,如下 /* * 定义用户,通过注解映射到数据库 */ @Table("user") public class User { @Column("id") private...
  • molu_chase
  • molu_chase
  • 2016-08-16 22:23:18
  • 1337

java注解实现map与bean之间的转换

最近敲代码时有一个map与bean之间的转换功能,操作比较烦 就考虑写util方法。但是map里的key跟bean的属性名称是不一样的(很简单的思维,如果我想map转bean 必须让他知道map的那个...
  • zhenge1632062086
  • zhenge1632062086
  • 2015-03-06 10:28:14
  • 592

【JSON 注解】JSON循环引用2----JSON注解@JsonIgnoreProperties+JAVA关键字transient+后台对象与JSON数据的格式互相转化

接着来说这个JSON循环引用的问题: http://www.cnblogs.com/sxdcgaq8080/p/5772784.html 关于JSON格式的转化,其实关键就是这几个依赖: 1...
  • qq_23476319
  • qq_23476319
  • 2017-03-13 21:48:05
  • 534

利用JAXB实现java对象和xml的相互转换

一:JAXB注解  JAXB(Java API for XML Binding),提供了一个快速便捷的方式将Java对象与XML进行转换。JAXB 可以实现Java对象与XML的相互转换,在JAXB中...
  • zhhpjl
  • zhhpjl
  • 2014-12-30 15:28:15
  • 2904

自定义注解的使用(将request参数中的数据解释成对象)

项目中,每个controller方法都需要验证用户登录,这里工程写了一个简单的注解,来将cookie中的用户信息还原成对象 注解类 package com.cheshangma.operati...
  • y_hai_yang
  • y_hai_yang
  • 2017-12-13 16:42:41
  • 393
    个人资料
    等级:
    访问量: 720
    积分: 60
    排名: 163万+
    文章分类
    文章存档