Значения объектов не сохраняются. (Spring MVC)
Я пытаюсь перенести старый код из WebSphere на Tomcat. В старом коде использовалась Spring 3.2, теперь я обновил JAR до 5.2.2. Но почему-то значения объекта просто не сохраняются.
Мой класс контроллера:
@Controller
@Scope("session")
public class OperationController {
private GUIDataObject guiDO = null;
/**
* Constructor
*/
public OperationController() {
}
@RequestMapping(value="/readDataSource")
@ResponseBody
public String readDataSource() {
try {
String[] sources = guiDO.getDataSources();
.
.
.
Code to work on Array sources
.
.
.
return "ok";
} catch (Exception e) {
return "Error: " + e.getMessage();
}
}
/**
* Set the data sources in the Data Storage Area - these are passed as a "parameter" map
* in the request.
* @param webRequest : WebRequest which parameter map can be pulled from
* @return "ok"
*/
@RequestMapping(value="/setDataSources")
@ResponseBody
public String setDataSources(WebRequest webRequest) {
guiDO.setDatasources(webRequest.getParameterMap());
return "ok";
}
.
.
.
Lots of other code.
.
.
.
}
и значения сохраняются в объекте:
public class GUIDataObject {
private String service;
private String uniqueProcessId;
private String userId;
private String vendor;
// record the data sources to read from
private Map<String, String[]> dataSources = null;
public GUIDataObject(String service, String uniqueProcessId, String userId, String vendor) {
super();
this.service = service;
this.uniqueProcessId = uniqueProcessId;
this.userId = userId;
this.vendor = vendor;
}
public void setDatasources(Map<String, String[]> datasources) {
this.dataSources = datasources;
}
public String[] getDataSources() throws Exception {
if (this.dataSources == null) {
throw new Exception("No datasources have been set from the GUI");
}
if (!this.dataSources.containsKey("source")) {
throw new Exception("No datasources have been set from the GUI");
}
return this.dataSources.get("source");
}
.
.
.
Lots of methods.
.
.
.
}
Теперь моя проблема в dataSources
Карта настраивается нормально. Но при получении значений они возвращаются пустыми. Это ошибка во втором блоке if, поэтому я могу сказать, что, по крайней мере, это не ноль. В объекте есть и другие карты / строки, но я не могу точно сказать, правильно ли они установлены или нет, поскольку это первый метод, который используется, и после этого он выдает ошибку. Я вижу, что значения, инициализированные в конструкторе, сохраняются нормально. Так что не могу сказать, где что-то не так.
Тот же код отлично работал в WebSphere и Spring 3.2. Теперь я не уверен, есть ли какие-то новые конфигурации, которые мне нужны, чтобы заставить это работать. Так как 3.2 очень-очень старая. Любая помощь по этому поводу будет оценена.
1 ответ
Проблема была в пути webRequest.getParameterMap()
работает в WebSphere и Tomcat. В WebSphere он возвращает конкретныйHashTable
. Но в Tomcat он возвращаетorg.apache.catalina.util.ParameterMap
который является подклассом HashMap
. И почему-то просто не смешиваются. Даже кастинг бросаетClassCastException
.
Я заставил его работать, изменив dataSources
к HashMap
.
private HashMap<String, String[]> dataSources = null;
и метод установки:
public void setDatasources(Map<String, String[]> datasources) {
if (this.dataSources == null) {
this.dataSources = new HashMap<String, String[]>();
this.dataSources.putAll(datasources);
} else {
this.dataSources.putAll(datasources);
}
Наверное, я мог бы оставить dataSources
как Map
и это все равно сработало бы. Но я не пробовал.