Spring Rest Api Json响应不显示属性名称

时间:2016-03-31 21:47:56

标签: java spring hibernate jpa

我是Spring的新手,当我从API获取json响应时,我正在处理奇怪的行为,我没有得到属性名称,只有值。我怎样才能找到阻止propertyName作为响应返回的内容?

当前回应:

  [
  [
    "6ED569AAE51C401CB621E96856766BF4",
    "{\"EventType\":\"Test\",\"lastName\":\"Smith\",\"age\":25,\"address\":{\"streetAddress\":\"212ndStreet\",\"city\":\"NewYork\",\"state\":\"NY\",\"postalCode\":\"10021\"}}",
    "{\"EventType\":\"Test\",\"lastName\":\"Smith\",\"age\":25,\"address\":{\"streetAddress\":\"212ndStreet\",\"city\":\"NewYork\",\"state\":\"NY\",\"postalCode\":\"10021\"}}",
    "JPA_USER",
    1459372275949,
    "JPA_USER",
    1459372275949,
    "A",
    "UPJPATESTEVENT",
    "8210D1C62E014F158859EC0D034435BC"
  ]
]

然而,正确的响应将使用以下属性名称:

[
  [
    "refEventTypeId":"6ED569AAE51C401CB621E96856766BF4",
    "jsonExampleDocument":"{\"EventType\":\"Test\",\"lastName\":\"Smith\",\"age\":25,\"address\":{\"streetAddress\":\"212ndStreet\",\"city\":\"NewYork\",\"state\":\"NY\",\"postalCode\":\"10021\"}}",
    "jsonAvroSchema":"{\"EventType\":\"Test\",\"lastName\":\"Smith\",\"age\":25,\"address\":{\"streetAddress\":\"212ndStreet\",\"city\":\"NewYork\",\"state\":\"NY\",\"postalCode\":\"10021\"}}",
    "createUser":"JPA_USER",
    "createDate":1459372275949,
    "updateUser":"JPA_USER",
    "updateDate":1459372275949,
    "status":"A",
    "eventType":"UPJPATESTEVENT",
    "tenantId":"8210D1C62E014F158859EC0D034435BC"
  ]
]

控制器:

@ResponseBody
@RequestMapping(value = "/abc", method = RequestMethod.GET, produces = "application/json")
public List<EventORM> getAllEvents2(@RequestParam(value = "status", required = false) String status) throws SQLException {                          

    List<EventORM> event = eventManager.getAllEvents(status);

    return event;   
}

我也尝试在控制器中使用ResponseEntity,但我仍然得到相同的结果:

@ResponseBody
    @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json")
    public ResponseEntity<List<EventORM>> getAllEvents(@RequestParam(value = "status", required = false) String status) throws SQLException {                           

        List<EventORM> event = eventManager.getAllEvents(status);

        return new ResponseEntity<List<EventORM>>(event, HttpStatus.OK);   
    }

DAOImpl:

public List<EventORM> getAllEvents(String status) {

    StringBuilder sql = new StringBuilder();
    sql.append("SELECT refEventTypeId, jsonExampleDocument, jsonAvroSchema, createUser, createDate, updateUser, updateDate, status, eventType, tenantId FROM EventORM event");

    Query queryEvents = entityManager.createQuery(sql.toString());          

    return queryEvents.getResultList(); 
}

型号:

package com.epsilon.al.ml.dao.orm.model;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import com.epsilon.al.ml.commons.AuditModelORM;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;

@Entity
@Table(name = "T_REF_EVENT_TYPE", schema = "MI_DEV_USER")
public class EventORM extends AuditModelORM implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 471512149777116797L;

    @Column(name = "REF_EVENT_TYPE_ID")
    @Id
    private String refEventTypeId;

    @Column(name = "JSON_EXAMPLE_DOCUMENT") 
    private String jsonExampleDocument; 

    @Column(name = "JSON_AVRO_SCHEMA")  
    private String jsonAvroSchema;      

    @Column(name = "EVENT_TYPE")
    private String eventType;

    @Column(name = "TENANT_ID")
    private String tenantId; 

    public String getEventType() {
        return eventType;
    }

    public void setEventType(String eventType) {
        this.eventType = eventType;
    }

    public String getTenantId() {
        return tenantId;
    }

    public void setTenantId(String tenantId) {
        this.tenantId = tenantId;
    }

    public String getRefEventTypeId() {
        return refEventTypeId;
    }

    public void setRefEventTypeId(String refEventTypeId) {
        this.refEventTypeId = refEventTypeId;
    }

    public String getJsonExampleDocument() {
        return jsonExampleDocument;
    }

    public void setJsonExampleDocument(String jsonExampleDocument) {
        this.jsonExampleDocument = jsonExampleDocument;
    }

    public String getJsonAvroSchema() {
        return jsonAvroSchema;
    }

    public void setJsonAvroSchema(String jsonAvroSchema) {
        this.jsonAvroSchema = jsonAvroSchema;
    }

    @Override
    public String toString() {
        return "EventORM [refEventTypeId=" + refEventTypeId + ", jsonExampleDocument=" + jsonExampleDocument
                + ", jsonAvroSchema=" + jsonAvroSchema + ", createUser=" + getCreateUser() + ", createDate=" + getCreateDate()
                + ", updateUser=" + getUpdateUser() + ", updateDate=" + getUpdateDate() + ", status=" + getStatus() + ", eventType="
                + eventType + ", tenantId=" + tenantId + "]";
    }

}

谢谢!

在我的案例中回答:

TypedQuery<EventORM> queryEvents = entityManager.createQuery(sql.toString(), EventORM.class);

1 个答案:

答案 0 :(得分:2)

您的问题在于以下代码,

StringBuilder sql = new StringBuilder();
sql.append("SELECT refEventTypeId, jsonExampleDocument, jsonAvroSchema, createUser, createDate, updateUser, updateDate, status, eventType, tenantId FROM EventORM event");
Query queryEvents = entityManager.createQuery(sql.toString()); 

使用HQL,您现在正在选择特定字段,以便将结果作为与这些字段对应的值列表返回。这与转换字符串列表相同。

解决方案是,

createQuery方法中指定类型,如下所示,

sql.append("SELECT event FROM EventORM event");
return entityManager.createQuery(sql.toString(), EventORM.class);

或者,如果您不想只选择特定的字段

创建一个新的POJO(即你在一个合适的DTO包中的EventDomDTO)并修改查询以使用EventDomDTO和你选择的字段

sql.append("SELECT new com.epsilon.al.ml.dao.orm.EventDomDTO(refEventTypeId, jsonExampleDocument, jsonAvroSchema, createUser, createDate, updateUser, updateDate, status, eventType, tenantId) FROM EventORM event");
return entityManager.createQuery(sql.toString(), EventDomDTO.class);

请注意,使用第二种方法,您必须更改getAllEvents的方法签名

public List<EventDomDTO> getAllEvents(String status)

现在您正在返回自定义POJO类。

希望这会对你有所帮助。

相关问题