Значения объектов не сохраняются. (Весна MVC) - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь перенести старый код из 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 Ответ

1 голос
/ 15 апреля 2020

Проблема была в том, как 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, и он все равно работал бы. Но я не пробовал.

...