- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
避免"empty element tags"的正确方法是什么序列化所需元素时?
例子:
@ElementList(name="rpc", required=true)
public ArrayList<FunctionRequest> getRequestedFunctions() {
return requestedFunctions;
}
<rpc/>
<rpc></rpc>
List<String>
,
List<int>
,
List<WhateverClass>
, ... 加上示例中为“rpc”的注释的不同名称属性。
Attribute
的类。和
Text
注释,只有!
RequestListConverter
.它有两个
protected
方法
prepareMethodList
和
writeRequest
.
prepareMethodList
将使用反射遍历给定类的所有方法并创建一个方法注释映射。
writeRequest
然后将写入给方法
prepareMethodList
的类型的单个对象到
write
中给出的 Simple 的 OutputNode
Converter
的方法界面。
public class RequestListConverter {
private HashMap<Method, Object> curMethodAnnotationMap = new HashMap<Method, Object>();
@SuppressWarnings("rawtypes")
protected void prepareMethodList(Class targetClass) {
/*
* First, get the annotation information from the given class.
*
* Since we use getters and setters, look for the "get" methods!
*/
Method[] curMethods = targetClass.getMethods();
for (Method curMethod : curMethods) {
String curName = curMethod.getName();
// We only want getter methods that return a String
if (curName.startsWith("get") && (curMethod.getReturnType() == String.class)) {
Attribute curAttrAnnotation = curMethod.getAnnotation(Attribute.class);
Text curTextAnnotation = curMethod.getAnnotation(Text.class);
if (curAttrAnnotation != null) {
curMethodAnnotationMap.put(curMethod, curAttrAnnotation);
} else
if (curTextAnnotation != null) {
curMethodAnnotationMap.put(curMethod, curTextAnnotation);
}
}
}
}
protected void writeRequest(OutputNode curNode, Object curRequest) throws Exception {
for (Map.Entry<Method, Object> curMapEntry : curMethodAnnotationMap
.entrySet()) {
if ((curMapEntry.getKey() == null)
|| (curMapEntry.getValue() == null)) {
continue;
}
Method curMethod = curMapEntry.getKey();
Attribute curAttrAnnotation = null;
Text curTextAnnotation = null;
if (curMapEntry.getValue() instanceof Attribute) {
curAttrAnnotation = (Attribute) curMapEntry.getValue();
} else if (curMapEntry.getValue() instanceof Text) {
curTextAnnotation = (Text) curMapEntry.getValue();
} else {
continue;
}
String curValue = null;
try {
// Try to invoke the getter
curValue = (String) curMethod.invoke(curRequest);
} catch (IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
// The getter method seems to need any argument, strange! Skip
// this!
continue;
}
// If the method has an Attribute annotation, then ...
if (curAttrAnnotation != null) {
boolean curAttrRequired = curAttrAnnotation.required();
String curAttrName = curAttrAnnotation.name();
/*
* IF the returned method value is NULL THEN IF if the attribute
* is required THEN throw a NullPointerException, ELSE skip the
* attribute
*/
if (curValue == null) {
if (curAttrRequired) {
throw new NullPointerException(
"The required attribute " + curAttrName
+ " returned NULL!");
} else {
continue;
}
}
// The attribute will be added as XML text now
curNode.setAttribute(curAttrName, curValue);
} else
// If the method has a Text annotation, then ...
if (curTextAnnotation != null) {
// we only need to store it for later string creation
curNode.setValue(curValue);
}
}
curNode.commit();
}
}
SetRequestListConverter
.它实现了 Simple 的
Converter
接口(interface),所以它提供了方法
read
未实现和
write
它获取可能包含元素或可能为空的列表。
SetRequestList
的转换器的实现。 .它扩展了之前介绍的基础
RequestConverter
类并实现
Converter
输入
SetRequestList
.
public class SetRequestListConverter extends RequestListConverter implements Converter<SetRequestList> {
@Override
public SetRequestList read(InputNode newNode) throws Exception {
return null;
}
@Override
public void write(OutputNode newNode, SetRequestList newValue) throws Exception {
if (newValue.requests.isEmpty()) {
newNode.setValue("");
return;
}
this.prepareMethodList(SetRequest.class);
/*
* Now we can go through all SetRequests and call the methods
* to build the XML attributes and to get the element value (i.e. parameters)
*/
for (SetRequest curRequest : newValue.requests) {
OutputNode curNode = newNode.getChild("set");
this.writeRequest(curNode, curRequest);
}
}
}
SetRequestList
是一个包含
ArrayList<SetRequest>
的简单类.这是为了隐藏这实际上是一个 ArrayList 的事实。
@Root
@Convert(SetRequestListConverter.class)
public abstract class SetRequestList {
protected ArrayList<SetRequest> requests = new ArrayList<SetRequest>();
public void add(T newRequest) {
requests.add(newRequest);
}
}
public class ClassToSerialize {
private SetRequestList requestedSets = new SetRequestList();
@Element(name="get", required=true)
public SetRequestList getRequestedSets() {
return requestedSets;
}
@Element(name="get", required=true)
public void setRequestedSets(SetRequestList newRequestedSets) {
requestedSets = newRequestedSets;
}
}
SetRequestList
生成的 XML包含元素将如下所示:
<get>
<set someAttribute="text" anotherAttribute="bla">Some Text</set>
...
</get>
SetRequestList
生成的 XML为空将如下所示:
<get></get>
SetRequest
中的注释。或任何类(class)!无需再次(重新)定义 XML 结构!
Formatter
class 实际上是在编写开始和结束标记,以及空元素标记。它是通过移交
Format
创建的。目的。 Simple 的 Javadoc 描述了
Format
类如下:
The Format object is used to provide information on how a generated XML document should be structured.
useEmptyEndTag
以及适当的 getter 和 setter 方法。变量将被初始化为
true
在构造函数内部。如果空结束标签样式不是应该创建的,可以在创建
Format
后设置对象使用
myFormat.setUseEmptyEndTag(false)
.
Formatter
类通过一个新的私有(private)变量来增强,该变量包含给定的
Format
对象,以便能够在适当的代码位置访问设置的参数。空的结束标签写在
writeEnd
里面.有看官方源代码才能看到原始代码。这是我的建议是避免空元素标签:
public void writeEnd(String name, String prefix) throws Exception {
String text = indenter.pop();
// This will act like the element contains text
if ((last == Tag.START) && (!format.isUseEmptyEndTag())) {
write('>');
last = Tag.TEXT;
}
if (last == Tag.START) {
write('/');
write('>');
} else {
if (last != Tag.TEXT) {
write(text);
}
if (last != Tag.START) {
write('<');
write('/');
write(name, prefix);
write('>');
}
}
last = Tag.END;
}
最佳答案
正如 baraky 之前所写,您可以使用 <rpc></rpc>
解决该部分。带有转换器的标签,如下所示:Prevent inclusion of empty tag for an empty ElementList in an ElementListUnion .ExampleConverter
上有评论这个特殊部分在哪里完成。
此外获得name
属性见这里:How do you access field annotations from a custom Converter with Simple?
所以你需要的是一个Converter
- 为您的类(class)实现。对于类型(int
、String
等),请查看 Transformer
-类(class)。
关于java - 避免简单框架输出中的空元素标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14955902/
我已经为使用 JGroups 编写了简单的测试。有两个像这样的简单应用程序 import org.jgroups.*; import org.jgroups.conf.ConfiguratorFact
我有一个通过 ajax 检索的 json 编码数据集。我尝试检索的一些数据点将返回 null 或空。 但是,我不希望将那些 null 或空值显示给最终用户,或传递给其他函数。 我现在正在做的是检查
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Why does one often see “null != variable” instead of “
嗨在我们公司,他们遵循与空值进行比较的严格规则。当我编码 if(variable!=null) 在代码审查中,我收到了对此的评论,将其更改为 if(null!=variable)。上面的代码对性能有影
我正在尝试使用 native Cordova QR 扫描仪插件编译项目,但是我不断收到此错误。据我了解,这是代码编写方式的问题,它向构造函数发送了错误的值,或者根本就没有找到构造函数。那么我该如何解决
我在装有 Java 1.8 的 Windows 10 上使用 Apache Nutch 1.14。我已按照 https://wiki.apache.org/nutch/NutchTutorial 中提
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: what is “=null” and “ IS NULL” Is there any difference bet
Three-EyedRaven 内网渗透初期,我们都希望可以豪无遗漏的尽最大可能打开目标内网攻击面,故,设计该工具的初衷是解决某些工具内网探测速率慢、运行卡死、服务爆破误报率高以及socks流
我想在Scala中像在Java中那样做: public void recv(String from) { recv(from, null); } public void recv(String
我正在尝试从一组图像补丁中创建一个密码本。我已将图像(Caltech 101)分成20 X 20图像块。我想为每个补丁创建一个SIFT描述符。但是对于某些图像补丁,它不返回任何描述符/关键点。我尝试使
我在验证器类中自动连接的两个服务有问题。这些服务工作正常,因为在我的 Controller 中是自动连接的。我有一个 applicationContext.xml 文件和 MyApp-servlet.
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭10 年前。 问题必须表现出对要解决的问题的最低程度的了解。告诉我们您尝试过做什么,为什么不起作用,以
大家好,我正在对数据库进行正常的选择,但是 mysql_num_rowsis 为空,我不知道为什么,我有 7 行选择。 如果您发现问题,请告诉我。 真的谢谢。 代码如下: function get_b
我想以以下格式创建一个字符串:id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&等,在for循环中,我得到
我正在尝试使用以下代码将URL转换为字符串: NSURL *urlOfOpenedFile = _service.myURLRequest.URL; NSString *fileThatWasOpen
我正在尝试将NSNumber传递到正在工作的UInt32中。然后,我试图将UInt32填充到NSData对象中。但是,这在这里变得有些时髦... 当我尝试将NSData对象中的内容写成它返回的字符串(
我正在进行身份验证并收到空 cookie。我想存储这个 cookie,但服务器没有返回给我 cookie。但响应代码是 200 ok。 httpConn.setRequestProperty(
我认为 Button bTutorial1 = (Button) findViewById(R.layout.tutorial1); bTutorial1.setOnClickListener
我的 Controller 中有这样的东西: model.attribute("hiringManagerMap",hiringManagerMap); 我正在访问此 hiringManagerMap
我想知道如何以正确的方式清空列表。在 div 中有一个列表然后清空 div 或列表更好吗? 我知道这是一个蹩脚的问题,但请帮助我理解这个 empty() 函数:) 案例)如果我运行这个脚本会发生什么:
我是一名优秀的程序员,十分优秀!