Я пытаюсь сделать службу REST для обслуживания табличных данных без фиксированной схемы (своего рода интерфейс REST для JDB C). Требуемый формат JSON выглядит примерно так:
{
"metadata": [
{
"name": "col1",
"sqlType": "VARCHAR",
"width": 255
},
{
"name": "col2",
"sqlType": "VARCHAR",
"width": 255
}
],
"rows": [
{
"col1": "val1",
"col2": "val2"
},
{
"col1": "val1",
"col2": "val2"
}
],
"runDate": "1970-01-01T02:59:59+03:00",
"startRow": 100,
"totalRows": 102
}
Как видите, все значения столбца для строки находятся в одном объекте JSON. Чтобы создать такой объект, я должен был вернуть экземпляр org.w3c.dom.Element
или JAXBElement
в качестве значения поля моего компонента.
Поскольку я сам вызываю element.setTextContent()
, я подумал, что было бы хорошо повторно использовать * Преобразователь 1009 * из реализации JAX-RS.
Возможно ли его получить? От javax.ws.rs.ext.Providers
может быть? Или можно преобразовать строку и дату с помощью JAX-RS?
Я видел здесь примеры того, как изменить формат даты, но не как получить Используемый в настоящее время формат.
Вот моя работа:
@Path("org.foo.newentity")
public class NewEntityFacadeREST {
private static final Logger LOGGER = Logger.getLogger(NewEntityFacadeREST.class.getName());
@Context
javax.ws.rs.ext.Providers providers;
public NewEntityFacadeREST() {
LOGGER.info("NewEntityFacadeREST");
}
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response find() throws ParserConfigurationException {
LOGGER.info("find");
Response res = new Response();
res.setRunDate(new Date(-1000L));
DocumentBuilderFactory aaa = DocumentBuilderFactory.newInstance();
DocumentBuilder db = aaa.newDocumentBuilder();
Document doc = db.newDocument();
List<Object> rows = new ArrayList<>();
rows.add(createElement(doc));
rows.add(createElement(doc));
res.setRows(rows);
List<ColumnDescription> metadata = new ArrayList<>();
metadata.add(bbb("col1"));
metadata.add(bbb("col2"));
res.setMetadata(metadata);
res.setStartRow(100);
res.setTotalRows(102);
return res;
}
private ColumnDescription bbb(String name) {
ColumnDescription colDesc = new ColumnDescription();
colDesc.setName(name);
colDesc.setSqlType(JDBCType.VARCHAR);
colDesc.setWidth(255);
return colDesc;
}
private Element createElement(Document doc) throws DOMException {
Element elem = doc.createElement(Response.ROWS);
// elem.setAttribute("attrname", "attrval");
Element subelem1 = doc.createElement("col1");
subelem1.setTextContent("val1");
elem.appendChild(subelem1);
Element subelem2 = doc.createElement("col2");
subelem2.setTextContent("val2");
elem.appendChild(subelem2);
return elem;
}
}
@XmlRootElement
public class Response {
public static final String ROWS = "rows";
private Date runDate;
private Integer startRow;
private Integer totalRows;
private List<Object> rows;
private List<ColumnDescription> metadata;
public Date getRunDate() {
return runDate;
}
public void setRunDate(Date runDate) {
this.runDate = runDate;
}
public Integer getTotalRows() {
return totalRows;
}
public void setTotalRows(Integer totalRows) {
this.totalRows = totalRows;
}
public Integer getStartRow() {
return startRow;
}
public void setStartRow(Integer startRow) {
this.startRow = startRow;
}
public List<ColumnDescription> getMetadata() {
if (metadata == null) {
metadata = new ArrayList<>();
}
return metadata;
}
public void setMetadata(List<ColumnDescription> metadata) {
this.metadata = metadata;
}
@XmlElement(name = ROWS)
public List<Object> getRows() {
if (rows == null) {
rows = new ArrayList<>();
}
return rows;
}
public void setRows(List<Object> rows) {
this.rows = rows;
}
}
public class ColumnDescription {
private String name;
private JDBCType sqlType;
private Integer width;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public JDBCType getSqlType() {
return sqlType;
}
public void setSqlType(JDBCType sqlType) {
this.sqlType = sqlType;
}
public Integer getWidth() {
return width;
}
public void setWidth(Integer width) {
this.width = width;
}
}