【问题标题】:Xstream field with converter is not an attribute even with @XStreamAsAttribute带有转换器的 Xstream 字段即使使用 @XStreamAsAttribute 也不是属性
【发布时间】:2015-01-16 14:24:15
【问题描述】:

我尝试编组一个对象,我希望所有字段都是属性。使用@XStreamAsAttribute 注释的普通字段是可以的,但我有两个带有转换器。对于他们来说,当我编组它们时,它们会被转换为字段......

@XStreamAlias(value="sinistre")
public class ObjetMetierSinistreDto {

    @XStreamAlias(value="S_sinistreEtat")
    @XStreamAsAttribute
    private String etat;

    @XStreamAsAttribute
    @XStreamAlias(value="S_sinistreDateSurv")
    @XStreamConverter(value=JodaDateConverter.class)
    private LocalDate dateSurvenanceDossier;
...

转换器:

public class JodaDateConverter implements Converter {

@Override
@SuppressWarnings("unchecked")
public boolean canConvert(final Class type) {
      return (type != null) && LocalDate.class.getPackage().equals(type.getPackage());
}

@Override
public void marshal(final Object source, final HierarchicalStreamWriter writer,
      final MarshallingContext context) {
      writer.setValue(source.toString().replace("-", "/"));
}

@Override
@SuppressWarnings("unchecked")
public Object unmarshal(final HierarchicalStreamReader reader,
      final UnmarshallingContext context) {
      try {
              final Class requiredType = context.getRequiredType();
              final Constructor constructor = requiredType.getConstructor(Object.class);
              return constructor.newInstance(reader.getValue());
      } catch (final Exception e) {
          throw new RuntimeException(String.format(
           "Exception while deserializing a Joda Time object: %s", context.getRequiredType().getSimpleName()), e);
      }
}

}

结果:

<sinistre S_sinistreEtat="S">        
  <S_sinistreDateSurv>2015/02/01</S_sinistreDateSurv>
</sinistre>

还有我喜欢的:

<sinistre S_sinistreEtat="S"
          S_sinistreDateSurv="2015/02/01"/>

【问题讨论】:

    标签: java xml xstream


    【解决方案1】:

    我终于找到解决这个问题的方法了!

    JodaDateConverter 不应实现 Converter,而是扩展 AbstractSingleValueConverter(作为 XStream 中的 DateConverter)

    那么你只需要覆盖canConvert()fromString() 就可以了!

    示例:

    public class JodaDateConverter extends AbstractSingleValueConverter {
    
    
    
     @Override
      @SuppressWarnings("unchecked")
      public boolean canConvert(final Class type) {
              return (type != null) && LocalDate.class.getPackage().equals(type.getPackage());
      }
    
      @Override
      public Object fromString(String str) {
        String separator;
        if(str.contains(":")){
          separator = ":";
        } else if(str.contains("/")){
          separator = "/";
        } else if(str.contains("-")){
          separator = "-";
        } else {
          throw new RuntimeException("The date must contains ':' or '/' or '-'");
        }
        String[] date = str.split(separator);
        if(date.length < 3){
          throw new RuntimeException("The date must contains hour, minute and second");
        }
        return new LocalDate(Integer.valueOf(date[0]),Integer.valueOf(date[1]),Integer.valueOf(date[2]));
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-09
      • 2016-09-27
      • 2021-11-29
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 2012-02-18
      • 1970-01-01
      相关资源
      最近更新 更多