Skip to content

Commit

Permalink
修复数据管理列表/编辑页面、SQL工作台查询结果对于大整数无法精确显示的BUG
Browse files Browse the repository at this point in the history
  • Loading branch information
interestinglife committed Aug 24, 2021
1 parent 3caa92d commit f055f50
Show file tree
Hide file tree
Showing 8 changed files with 211 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,13 @@ public abstract class AbstractController
{
public static final String RESPONSE_ENCODING = "UTF-8";

public static final String CONTENT_TYPE_JSON = "application/json;";
public static final String CONTENT_TYPE_JSON = "application/json";

public static final String CONTENT_TYPE_HTML = "text/html;";
public static final String CONTENT_TYPE_HTML = "text/html";

public static final String CONTENT_TYPE_CSS = "text/css;";
public static final String CONTENT_TYPE_CSS = "text/css";

public static final String CONTENT_TYPE_JAVASCRIPT = "application/javascript;";
public static final String CONTENT_TYPE_JAVASCRIPT = "application/javascript";

public static final String KEY_TITLE_MESSAGE_KEY = "titleMessageKey";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.io.Writer;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Collections;
Expand Down Expand Up @@ -109,6 +110,8 @@ public class DataController extends AbstractSchemaConnTableController

private ObjectMapper _objectMapper;

private ObjectMapper _objectMapperForBigNumberToString;

public DataController()
{
super();
Expand Down Expand Up @@ -184,6 +187,7 @@ public void setObjectMapperBuilder(ObjectMapperBuilder objectMapperBuilder)
{
this.objectMapperBuilder = objectMapperBuilder;
this._objectMapper = this.objectMapperBuilder.build();
this._objectMapperForBigNumberToString = this.objectMapperBuilder.buildForBigNumberToString();
}

@RequestMapping("/{schemaId}/{tableName}/query")
Expand Down Expand Up @@ -215,8 +219,7 @@ protected void execute(HttpServletRequest request, HttpServletResponse response,
}

@RequestMapping(value = "/{schemaId}/{tableName}/queryData", produces = CONTENT_TYPE_JSON)
@ResponseBody
public PagingData<Row> queryData(HttpServletRequest request, HttpServletResponse response,
public void queryData(HttpServletRequest request, HttpServletResponse response,
final org.springframework.ui.Model springModel, @PathVariable("schemaId") String schemaId,
@PathVariable("tableName") String tableName, @RequestBody(required = false) PagingQuery paramData)
throws Throwable
Expand All @@ -241,7 +244,12 @@ protected PagingData<Row> execute(HttpServletRequest request, HttpServletRespons
}
};

return executor.execute();
PagingData<Row> pagingData = executor.execute();

response.setContentType(CONTENT_TYPE_JSON);
Writer out = response.getWriter();

this._objectMapperForBigNumberToString.writeValue(out, pagingData);
}

@RequestMapping(value = "/{schemaId}/{tableName}/getQuerySql", produces = CONTENT_TYPE_JSON)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.io.StringReader;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand All @@ -35,6 +36,7 @@
import org.datagear.util.SqlScriptParser;
import org.datagear.util.SqlScriptParser.SqlStatement;
import org.datagear.util.StringUtil;
import org.datagear.web.json.jackson.ObjectMapperBuilder;
import org.datagear.web.sqlpad.SqlpadExecutionService;
import org.datagear.web.sqlpad.SqlpadExecutionService.CommitMode;
import org.datagear.web.sqlpad.SqlpadExecutionService.ExceptionHandleMode;
Expand All @@ -52,6 +54,8 @@
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.fasterxml.jackson.databind.ObjectMapper;

/**
* SQL工作台控制器。
*
Expand All @@ -78,6 +82,10 @@ public class SqlpadController extends AbstractSchemaConnController

private int sqlResultReadActualLobRows = 3;

private ObjectMapperBuilder objectMapperBuilder;

private ObjectMapper _objectMapperForBigNumberToString;

public SqlpadController()
{
super();
Expand Down Expand Up @@ -133,6 +141,18 @@ public void setSqlResultReadActualLobRows(int sqlResultReadActualLobRows)
this.sqlResultReadActualLobRows = sqlResultReadActualLobRows;
}

public ObjectMapperBuilder getObjectMapperBuilder()
{
return objectMapperBuilder;
}

@Autowired
public void setObjectMapperBuilder(ObjectMapperBuilder objectMapperBuilder)
{
this.objectMapperBuilder = objectMapperBuilder;
this._objectMapperForBigNumberToString = this.objectMapperBuilder.buildForBigNumberToString();
}

@RequestMapping("/{schemaId}")
public String index(HttpServletRequest request, HttpServletResponse response,
org.springframework.ui.Model springModel, @PathVariable("schemaId") String schemaId) throws Throwable
Expand Down Expand Up @@ -222,8 +242,7 @@ public ResponseEntity<OperationMessage> command(HttpServletRequest request, Http
}

@RequestMapping(value = "/{schemaId}/message", produces = CONTENT_TYPE_JSON)
@ResponseBody
public List<Object> message(HttpServletRequest request, HttpServletResponse response,
public void message(HttpServletRequest request, HttpServletResponse response,
org.springframework.ui.Model springModel, @PathVariable("schemaId") String schemaId,
@RequestParam("sqlpadId") String sqlpadId,
@RequestParam(value = "messageCount", required = false) Integer messageCount) throws Throwable
Expand All @@ -232,13 +251,17 @@ public List<Object> message(HttpServletRequest request, HttpServletResponse resp
messageCount = 50;
if (messageCount < 1)
messageCount = 1;

List<Object> messages= this.sqlpadExecutionService.message(sqlpadId, messageCount);

return this.sqlpadExecutionService.message(sqlpadId, messageCount);
response.setContentType(CONTENT_TYPE_JSON);
Writer out = response.getWriter();

this._objectMapperForBigNumberToString.writeValue(out, messages);
}

@RequestMapping(value = "/{schemaId}/select", produces = CONTENT_TYPE_JSON)
@ResponseBody
public SqlSelectResult select(HttpServletRequest request, HttpServletResponse response,
public void select(HttpServletRequest request, HttpServletResponse response,
org.springframework.ui.Model springModel, @PathVariable("schemaId") String schemaId,
@RequestParam("sqlpadId") String sqlpadId, @RequestParam("sql") final String sql,
@RequestParam(value = "startRow", required = false) Integer startRow,
Expand Down Expand Up @@ -281,7 +304,10 @@ protected SqlSelectResult execute(HttpServletRequest request, HttpServletRespons
if (!Boolean.TRUE.equals(returnMeta))
result.setTable(null);

return result;
response.setContentType(CONTENT_TYPE_JSON);
Writer out = response.getWriter();

this._objectMapperForBigNumberToString.writeValue(out, result);
}

@RequestMapping("/{schemaId}/downloadResultField")
Expand Down Expand Up @@ -322,7 +348,7 @@ public void downloadResultField(HttpServletRequest request, HttpServletResponse

@RequestMapping(value = "/{schemaId}/sqlHistoryData", produces = CONTENT_TYPE_JSON)
@ResponseBody
public PagingData<SqlHistory> pagingQueryTable(HttpServletRequest request, HttpServletResponse response,
public PagingData<SqlHistory> pagingQuerySqlHistory(HttpServletRequest request, HttpServletResponse response,
org.springframework.ui.Model springModel, @PathVariable("schemaId") String schemaId,
PagingQuery pagingQueryParam) throws Throwable
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
package org.datagear.web.freemarker;

import java.io.IOException;
import java.util.Collection;
import java.util.Map;

import org.datagear.analysis.support.JsonSupport;
Expand All @@ -18,6 +17,7 @@

import freemarker.core.Environment;
import freemarker.ext.util.WrapperTemplateModel;
import freemarker.template.TemplateBooleanModel;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
Expand All @@ -33,10 +33,15 @@
*/
public class WriteJsonTemplateDirectiveModel implements TemplateDirectiveModel
{
public static final String KEY_VAR = "var";
public static final String KEY_BIG_NUMBER_TO_STRING = "bigNumberToString";

private ObjectMapperBuilder objectMapperBuilder;

private ObjectMapper _objectMapper;

private ObjectMapper _objectMapperForBigNumberToString;

public WriteJsonTemplateDirectiveModel()
{
super();
Expand All @@ -57,36 +62,41 @@ public void setObjectMapperBuilder(ObjectMapperBuilder objectMapperBuilder)
{
this.objectMapperBuilder = objectMapperBuilder;
this._objectMapper = this.objectMapperBuilder.build();
this._objectMapperForBigNumberToString = this.objectMapperBuilder.buildForBigNumberToString();
JsonSupport.disableAutoCloseTargetFeature(this._objectMapper);
JsonSupport.disableAutoCloseTargetFeature(this._objectMapperForBigNumberToString);
}

@SuppressWarnings("rawtypes")
@Override
public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
throws TemplateException, IOException
{
if (params.size() != 1)
throw new TemplateModelException("The directive only allow one parameter.");
TemplateModel var = (TemplateModel)params.get(KEY_VAR);
TemplateBooleanModel bigNumberToStringObj = (TemplateBooleanModel) params.get(KEY_BIG_NUMBER_TO_STRING);
boolean bigNumberToString = (bigNumberToStringObj == null ? false : bigNumberToStringObj.getAsBoolean());

@SuppressWarnings("unchecked")
Collection<TemplateModel> args = ((Map<String, TemplateModel>) params).values();
Object obj = unwrap(var);

for (TemplateModel arg : args)
try
{
Object obj = unwrap(arg);

try
if (bigNumberToString)
{
this._objectMapper.writeValue(env.getOut(), obj);
this._objectMapperForBigNumberToString.writeValue(env.getOut(), obj);
}
catch (Throwable t)
else
{
if (t instanceof IOException)
throw (IOException) t;
else
throw new TemplateException(t, env);
this._objectMapper.writeValue(env.getOut(), obj);
}
}
catch (IOException e)
{
throw e;
}
catch (Throwable t)
{
throw new TemplateException(t, env);
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* Copyright 2018 datagear.tech
*
* Licensed under the LGPLv3 license:
* http://www.gnu.org/licenses/lgpl-3.0.html
*/

package org.datagear.web.json.jackson;

import java.io.IOException;
import java.math.BigInteger;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

/**
* {@linkplain BigInteger}型作为字符串输出的{@linkplain JsonSerializer}。
*
* @author [email protected]
*
* @param <T>
*/
public class BigIntegerToStringSerializer extends JsonSerializer<BigInteger>
{
public BigIntegerToStringSerializer()
{
super();
}

@Override
public void serialize(BigInteger value, JsonGenerator gen, SerializerProvider serializers) throws IOException
{
String str = (value == null ? null : value.toString());
serializers.defaultSerializeValue(str, gen);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* Copyright 2018 datagear.tech
*
* Licensed under the LGPLv3 license:
* http://www.gnu.org/licenses/lgpl-3.0.html
*/

package org.datagear.web.json.jackson;

import java.io.IOException;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

/**
* {@linkplain Long}型作为字符串输出的{@linkplain JsonSerializer}。
*
* @author [email protected]
*
* @param <T>
*/
public class LongToStringSerializer extends JsonSerializer<Long>
{
public LongToStringSerializer()
{
super();
}

@Override
public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers) throws IOException
{
String str = (value == null ? null : value.toString());
serializers.defaultSerializeValue(str, gen);
}
}
Loading

0 comments on commit f055f50

Please sign in to comment.