【问题标题】:Access Java Enum fields in javascript在 javascript 中访问 Java 枚举字段
【发布时间】:2017-05-05 13:52:19
【问题描述】:

我正在尝试在 java 脚本中访问此枚举的 facility 字符串

public enum FacilityEnum {

    CAR_VALET("carValet"),
    INDOOR("indoorPark"),
    DISABLED_ACCESS("disabledAccess"),
    EV_CHARGE("evCharge"),

    private String facility;

    private FacilityEnum(String facility) {
        this.facility = facility;
    }

    public String getFacility() {
        return facility;
    }

    public void setFacility(String facility) {
        this.facility = facility;
    }



}

这个枚举用于 Facility.class

@Entity
public class Facility {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long facilityId;

    @Enumerated(EnumType.STRING)
    private FacilityEnum service;


    @ManyToMany(mappedBy = "facilities")
    @JsonBackReference("parks-facilities-services")
    private Set<Park> parks;
    }


    public FacilityEnum getService() {
        return service;
    }

    public void setService(FacilityEnum service) {
        this.service = service;
    }

与 Park.class 具有多对多关系。

当我需要在 javascript 中使用 facility 字符串时,问题就来了

这是 javascript 感兴趣的部分,我正在使用 Spring + Thymleaf

var parcheggi = JSON.parse([[${parks}]]); //my list of Parks
parcheggi.forEach(function (arrayItem) { //it's ok

            var parcheggio = arrayItem;
            var services = parcheggio.facilities; //it's ok, i get Facility objects
            var servicesDiv = '<div>';
            services.forEach(function (service){
                var s = service; //the single Facility

                servicesDiv += '<img src="/images/park_icons/facilities/' + s.service + '.png" />'
            });
            servicesDiv += '</div>';

 //rest of the code...

在这种情况下,s.service 是粗略的枚举(CAR_VALET,INDOOR...),如果我尝试s.service.facility,我会得到未定义.. 我需要有 carValet、indoor、disabledAccess 等等...

【问题讨论】:

  • 你是用jackson做json序列化的吗?
  • 是的,序列化工作,我得到所有的服务
  • 能否请您展示一下您的facilityenum 的getter 和setter?
  • 当然,我已经在 Facility.class 中添加了它们

标签: javascript java spring enums


【解决方案1】:

一种方法是配置对象映射器以使用 toString 方法序列化枚举。您可以将以下内容添加到对象映射器配置中:

 objectMapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);

(请注意,以前的 Jackson 版本与此属性等效,但有所不同)。

然后将 toString 添加到您的枚举中:

@Override
public String toString ()
{
    return facility;
}

【讨论】:

  • 尽管这样可行,但依赖 toString 来实现业务逻辑并不是一个好主意。 toString 旨在为用于记录目的的对象提供人类可读的表示。问题是 Java 枚举在表示为 JSON 时会被扁平化为单个字符串。我建议创建一个单独的数据传输对象 (DTO),其中包含您的视图所需的所有数据,包括一个字符串工具,您可以使用正确的值填充服务器端。
【解决方案2】:

您收到undefined,因为您的 Enum 无法在 JSON 中反序列化,您有两种选择:

  • 要么更改 Enum 的实现,因此它只包含 Stringconstants,它会被 Jackson 正确映射。

您的代码将是:

public enum FacilityEnum {
    CAR_VALET,
    INDOOR,
    DISABLED_ACCESS,
    EV_CHARGE;
}
  • 或者你应该重写 Enum 中的 toString() 方法,这样它就可以 被反序列化并返回为String

您的代码将是:

public enum FacilityEnum {

  CAR_VALET("carValet"),
    INDOOR("indoorPark"),
    DISABLED_ACCESS("disabledAccess"),
    EV_CHARGE("evCharge"),

    private String facility;

  private FacilityEnum(String facility) {
    this.facility = facility;
  }

  public String getFacility() {
    return facility;
  }

  public void setFacility(String facility) {
    this.facility = facility;
  }

  @Override
  public String toString() {
    return facility;
  }

}

【讨论】:

  • 谢谢,感谢@xsx4u
猜你喜欢
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 2021-12-22
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多