在Restful服务上发送ResultSet的Json,而不使用POJO类或仅使用1个POJO类别



我正在尝试实现restful服务,它将从PostgreSQL的ResultSet发送Json,我可以使用Jersey通过将结果集映射到POJO类来发送,我不想使用任何其他像Gson这样的库,但我想直接以Json的形式发送结果集,而不需要中间POJO,因为我不需要用于任何其他目的的POJO,我对servlet、restfull或JAXB等不是很熟悉

我能够在没有POJO类的情况下从ResultSet创建一个自定义的JsonArray(Javax.json),并转换为String并在服务中发送String,截至目前,用于数字、字符串、日期,时间戳(甚至可以尝试使用递归为数组做,没有写Custom MessageBodyWriter,但可以写简单的,甚至可以假装为此写),但不完全理解我所做的是否正确,以及如何将PostgreSQL的所有数据类型处理到Json并通过Rest.发送

请给我建议如何实现这一点,以及请在Jersey、JAXB、JAX-RS上更清楚地评论一些小的进展,以及它们之间的相互关系,例如,POJO是如何在内部转换为Json的,正在转换的MessageBodyWriter在哪里。

请给我有关球衣的建议,而不是其他图书馆。

谢谢。

请找到我写的下面的代码,并建议我甚至改进。

资源类别:

@Path("/message")
public class MessageResource {
MessageService msgService = new MessageService();
Test t = new Test();
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getMessages() throws SQLException {
return t.getAllMessages();
}
}

服务类别:

public class Test {
private static ResultSetMetaData rsmd;
private static int numOfColumns;
PostgreHelper help = new PostgreHelper();
public String getAllMessages() throws SQLException {
RetrieveFromPostGre getData = new RetrieveFromPostGre();
Map<String, ?> config = null;
JsonBuilderFactory factory = Json.createBuilderFactory(config);
JsonObjectBuilder rowJsonObject = factory.createObjectBuilder();
JsonArrayBuilder tableJsonArray = factory.createArrayBuilder();
getData.selectRows("db1", "schema1", "table1");
ResultSet rs = getData.selectRows("db1", "schema1", "table1");
rsmd=rs.getMetaData();  
numOfColumns = rsmd.getColumnCount();
try {
while(rs.next()) { 
createJsonObjectOfSingleRow(rs, rowJsonObject);
tableJsonArray.add(rowJsonObject);
}
} catch (Exception e) {
System.out.println("error");
}
return tableJsonArray.build().toString();
}
public void createJsonObjectOfSingleRow(ResultSet rs, JsonObjectBuilder rowJsonObject) throws SQLException {
String numberType[] = {"BOOLEAN", "INTEGER", "FLOAT", "LONG", "DOUBLE"};
String stringType[] = {"STRING", "DATE"};
for (int i=1; i<=numOfColumns; i++) {                    
String column_name = rsmd.getColumnName(i);
System.out.println(help.getDataType(rsmd.getColumnType(i)));
if(Arrays.asList(numberType).contains(help.getDataType(rsmd.getColumnType(i)))) {
System.out.println("in num");
rowJsonObject.add(column_name, rs.getInt(column_name));
}
else if(Arrays.asList(stringType).contains(help.getDataType(rsmd.getColumnType(i)))) {
System.out.println("in stri");
rowJsonObject.add(column_name, rs.getString(column_name));
}
else if(help.getDataType(rsmd.getColumnType(i)).equalsIgnoreCase("ARRAY")) {
/* This is not working, and here I was thinking of doing recursion*/
//System.out.println("in arr");
//JsonArray jArray = (JsonArray) rs.getArray(column_name);
//rowJsonObject.add(column_name, jArray);
rowJsonObject.add("array", "flag");//just for the sake of running code successfully wrote this statement
}
}
}
}

PostgreServices:

public class RetrieveFromPostGre {
PostgreConnection postgreConnection = new PostgreConnection();
PostgreHelper getColumnsMeta = new PostgreHelper();
private String databaseName, schemaName, tableName;
private Map<String, String> columns = new HashMap<String, String>();
public String getDatabaseName() {
return databaseName;
}
public void setDatabaseName(String databaseName) {
this.databaseName = databaseName;
}
public String getSchemaName() {
return schemaName;
}
public void setSchemaName(String schemaName) {
this.schemaName = schemaName;
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public Map<String, String> getColumns() {
return columns;
}
public void setColumns(Map<String, String> columns) {
this.columns = columns;
}
public ResultSet selectRows(String databaseName, String schemaName, String tableName) throws SQLException {
this.setDatabaseName(databaseName);
this.setSchemaName(schemaName);
this.setTableName(tableName);
Connection dbConnection = postgreConnection.getdbconnection(this.getDatabaseName());
ResultSet rs = this.retrieveRows(dbConnection);
return rs;
}
public ResultSet retrieveRows(Connection dbConnection) throws SQLException {
Statement stmt = null;
ResultSet rs = null;
String sql;
sql = "select * from " + this.schemaName + "." + this.tableName;
try {
stmt = dbConnection.createStatement();
rs = stmt.executeQuery(sql);
return rs;
//stmt.close();
} catch (Exception e) {
System.err.println( e.getClass().getName()+": "+ e.getMessage() );
e.printStackTrace();
System.exit(0);
}
return rs;      
}
}

DatabaseHelper:

public class PostgreHelper {
public String getDataType(int i) {
String type="";
switch(i) {
case java.sql.Types.INTEGER:  
type="INTEGER";      break;
case java.sql.Types.BIGINT:  
type="LONG";      break;
case java.sql.Types.BOOLEAN:  
type="BOOLEAN";      break;
case java.sql.Types.BIT:  
type="BOOLEAN";      break;
case java.sql.Types.FLOAT:   
type="FLOAT";       break;
case java.sql.Types.REAL:  
type="DOUBLE";        break;
case java.sql.Types.DOUBLE: 
type="DOUBLE";      break;
case java.sql.Types.NUMERIC:  
type="INTEGER";     break;
case java.sql.Types.DECIMAL:  
type="DOUBLE";     break;
case java.sql.Types.CHAR:  
type="STRING";        break;
case java.sql.Types.NCHAR:  
type="STRING";        break;
case java.sql.Types.VARCHAR:  
type="STRING";    break;
case java.sql.Types.NVARCHAR:  
type="STRING";    break;
case java.sql.Types.LONGVARCHAR: 
type="STRING"; break;
case java.sql.Types.DATE: 
type="DATE";        break;
case java.sql.Types.TIME: 
type="DATE";        break;
case java.sql.Types.TIMESTAMP: 
type="DATE";   break;
case java.sql.Types.BINARY:  
type="BINARY";     break;
case java.sql.Types.VARBINARY:  
type="BINARY";  break;
case java.sql.Types.LONGVARBINARY:   
type="BINARY"; break;
case java.sql.Types.NULL: 
type="STRING";        break;
case java.sql.Types.OTHER:  
type="STRING";       break;
case java.sql.Types.JAVA_OBJECT:  
type="OBJECT"; break;
case java.sql.Types.DISTINCT:  
type="STRING";    break;
case java.sql.Types.STRUCT:  
type="STRING";      break;
case java.sql.Types.ARRAY:  
type="ARRAY";      break;
case java.sql.Types.BLOB:  
type="STRING";        break;
case java.sql.Types.CLOB:  
type="STRING";        break;
case java.sql.Types.REF:  
type="STRING";         break;
} 
return type;
}
}

SerializableJSONArray代码,我写这个类代码只是为了让评论者知道它是否有效:

public class SerializableJSONArray implements Serializable {
private transient JSONArray jsonArray;
public SerializableJSONArray(JSONArray jsonArray) {
this.jsonArray = jsonArray;
}
public JSONArray getJSONArray() {
return jsonArray;
}
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
oos.writeObject(jsonArray.toString());
}
private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException, JSONException {
ois.defaultReadObject();
jsonArray = new JSONArray((String) ois.readObject());
}
}

ResultSet不可序列化。您不能将它们直接转换(序列化)为json。

在将ResultSet转换为json之前,首先需要将所需的值从ResultSet提取到某个可序列化对象。

将对象存储在映射中,然后将映射转换为json。

下面的例子做到了这一点,甚至不需要jackson。它使用javax.json

public static String toJSON(List<Map<String,String>> maps) {
return javax.json.Json.createArrayBuilder(maps).build().toString();
}

最新更新