我是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);
答案 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类。
希望这会对你有所帮助。