Формат даты в @XmlAnyElement - PullRequest
       17

Формат даты в @XmlAnyElement

0 голосов
/ 04 февраля 2020

Я пытаюсь сделать службу 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;
    }

}
...