有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是否有合适的模式或方法来遍历数据和动态构造对象?

我正在寻找一些潜在的关于对象遍历的设计模式建议,以便根据所提供的数据动态构造对象

下面,我正在手动构建此对象。最初,根节点是BinaryLogicOpType,但是可以是基于rootNodeType的不同对象

我的问题是。。我需要根据列表中的字符串数据动态构造这些不同类型的对象。这样做的最佳途径是什么

如果这个问题让人困惑的话,我愿意细化它

String rootNodeType = fN.type;

BinaryLogicOpType _blop = new BinaryLogicOpType();
JAXBElement<BinaryLogicOpType> root = constructRootElement(_blop, factory, rootNodeType);

/** LETS CREATE THE FIRST CHILD ELEMENT */
BinaryComparisonOpType attrName1GTEFive = new BinaryComparisonOpType();
_blop.getOps().add(factory.createPropertyIsEqualTo(attrName1GTEFive));

JAXBElement<String> attr1Property = factory.createValueReference(fN.nodes.get(0).getProperty());
LiteralType attr1ValueLiteral = new LiteralType();
attr1ValueLiteral.getContent().add(fN.nodes.get(0).getValue());

JAXBElement<LiteralType> attr1Value = factory.createLiteral(attr1ValueLiteral);

attrName1GTEFive.getExpression().add(attr1Property);
attrName1GTEFive.getExpression().add(attr1Value);

示例JSON

{
  "type": "AND",
  "filters": [
    {
      "type": "=",
      "value": "exampleid",
      "property": "id"
    },
    {
      "type": "ILIKE",
      "value": "*",
      "property": "metacard-tags"
    },
    {
      "type": "OR",
      "filters": [
        {
          "type": ">=",
          "value": null,
          "property": "benumber"
        },
        {
          "type": "ILIKE",
          "value": "redshirts",
          "property": "title",
          "isCaseSensitive": true
        }
      ]
    }
  ]
}

示例XML

<?xml version="1.0" encoding="UTF-8"?><fes:Filter xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fes="http://www.opengis.net/fes/2.0" xmlns:gml="http://www.opengis.net/gml/3.2">
  <fes:Or>
    <fes:PropertyIsLessThan matchAction="ANY" matchCase="false">
      <fes:ValueReference>name</fes:ValueReference>
      <fes:Function name="sub">
        <fes:Literal>my-id</fes:Literal>
      </fes:Function>
    </fes:PropertyIsLessThan>
    <fes:And>
      <fes:PropertyIsGreaterThanOrEqualTo matchAction="ANY" matchCase="false">
        <fes:ValueReference>attName</fes:ValueReference>
        <fes:Literal>5</fes:Literal>
      </fes:PropertyIsGreaterThanOrEqualTo>
      <fes:PropertyIsLike escapeChar="\" matchCase="false" singleChar="?" wildCard="*">
        <fes:ValueReference>title</fes:ValueReference>
        <fes:Literal>greetings</fes:Literal>
      </fes:PropertyIsLike>
      <fes:PropertyIsEqual>
        <fes:ValueReference>be_number</fes:ValueReference>
        <fes:Function>
            <fes:Parameter>null</fes:Parameter>
            <fes:Parameter>null</fes:Parameter>
        </fes:Function> 
      </fes:PropertyIsEqual>
    </fes:And>
  </fes:Or>
</fes:Filter>

共 (1) 个答案

  1. # 1 楼答案

    我认为确实没有简单的解决方案,但我非常确信,用OOP以相当优雅的方式实现转换是可能的

    本质上,在这两种情况下,您都在处理AST。它们的结构也没有什么不同。因此,如果您能够为每种可能的节点类型实现转换例程,那么您应该能够转换整个AST

    首先,我将为您的JSON结构实现一个好的Java模型。类,如AndExpressionComparisonExpressionLikeExpressionOrExpression等。有关灵感,请检查Filter模式的生成类。良好的造型在这里至关重要

    使用poliformic反序列化,以便在解析Jackson后获得正确的对象结构。现在,您“只”需要将此结构转换为JAXB结构

    最简单的方法是直接向JSON模型类添加转换方法。我会让他们都用如下方法实现一个接口:

    public Object convertToJAXB(ObjectFactory objectFactory);
    

    对于像ILIKE这样的“叶”AST节点,您可以直接构造适当的对象
    对于像ANDOR这样的“复合”AST节点,您需要在每个filters上调用convertToJAXB,然后通过将结果包装到JAXBElements中来做更多的工作。这里可能需要一些instanceof检查;应该有可能想出一个更智能的解决方案