Как перебрать входное значение в тимелист - PullRequest
1 голос
/ 22 января 2020

Я пытаюсь перебрать поле ввода через GET в Java Controller и thymeleaf, но он дает мне ошибку «результат возвращает более одного элемента»

Мой GET может получить массив строк Идентификаторы, но я не могу поместить их в свою форму, я буду использовать свою форму, чтобы отправить ее и удалить массив идентификаторов строк. Это работает, если пользовательский ввод только один, но когда пользовательский ввод становится 2 или более, он показывает ошибку "результат возвращает более одного элемента"

Это мой код на Java Контроллер

@RequestMapping(value="/delete-asset", method = RequestMethod.GET)
public String deleteAsset(@RequestParam String[] assetID, Model model) {
    //to populate the form
    model.addAttribute("DeleteCategoryObject", assetService.getAssetInfo(assetID));
    return "delete-asset";
}

Это мой код на Html Форма

<form method="POST" name="deleteFormAdd" id="deleteFormAdd" th:object="${DeleteCategoryObject}"enctype="multipart/form-data">
    <input type="hidden" name="_csrf" th:value="${_csrf.token}" />
    //The code can't iterate the String of array given by the GET
    <input type="hidden" th:field="*{assetID}" />

    //This button is for submitting the String of array ID to be deleted
    <input type="button"  class="btn btn-primary btn-block" value="Yes" th:onclick="'javascript:submitForm(\'deleteFormAdd\',\''+@{/delete-asset}+'\')'" />
    <button type="reset" onclick="window.location.href = 'manage-assets.html';" class="btn btn-default btn-block"> Cancel</button>
</form>

Код может принять эту ссылку

enter image description here

Но он показывает ошибку «результат возвращает более одного элемента», если заданный идентификатор равен 2 или более

enter image description here

Полная ошибка

org .springframework.dao.IncorrectResultSizeDataAccessException: результат возвращает более одного элемента; вложенное исключение - javax.persistence.NonUniqueResultException: результат возвращает более одного элемента

Java DAO / Query

@Query("From AssetCategory A WHERE A.assetID IN (:assetID)")
public AssetCategory getAssetInfo(@Param("assetID") String[] assetID);

AssetCategory

@Entity
@Table(name = "ASSET_TYPE")
public class AssetCategory implements Serializable{

private static final long serialVersionUID = 595169758417136780L;

@Id
@Column(name = "ASSET_ID")
@GenericGenerator(name="uuid", strategy="uuid")
@GeneratedValue(generator="uuid")
private String assetID;

@Column(name = "ASSET_TYPE")
private String assetType;

@Column(name = "CATEGORY")
private String category;

@Column(name = "DESCRIPTION")
private String description;

@Column(name = "CREATED_BY")
private String createdBy;

public AssetCategory() {
    super();
    public AssetCategory(String assetID, String assetType, String category, String description, String createdBy) {
    super();
    this.assetID = assetID;
    this.assetType = assetType;
    this.category = category;
    this.description = description;
    this.createdBy = createdBy;
} 
//getters setters below
public String getAssetID() {
    return assetID;
}

public void setAssetID(String assetID) {
    this.assetID = assetID;
}

public String getAssetType() {
    return assetType;
}

public void setAssetType(String assetType) {
    this.assetType = assetType;
}

public String getCategory() {
    return category;
}

public void setCategory(String category) {
    this.category = category;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getCreatedBy() {
    return createdBy;
}

public void setCreatedBy(String createdBy) {
    this.createdBy = createdBy;
}

Контроллер для Java Удалить сообщение

@RequestMapping(value = "/delete-asset", method = RequestMethod.POST)
public @ResponseBody String deleteAsset(@ModelAttribute AssetCategory assetCategory) {

    JsonObject result = new JsonObject();
    assetService.deleteAssets(assetCategory.getAssetID());
    result.addProperty("result", "Success");
    result.addProperty("status", 1);
    result.addProperty("message", "Asset Deleted!");
    return result.toString();
}

Запрос на удаление POST

@Query("Delete From AssetCategory A WHERE A.assetID IN (:assetID)")
List<AssetCategory> deleteAssets(@Param("assetID") String[] assetID);

Удалить службу POST

@Override
public List <AssetCategory> deleteAssets(String[] assetID) {
    return dao.deleteAssets(assetID);
}

Функция отправки формы

function submitForm(formID, url){
    var formData = new FormData($("#" + formID)[0]);
    $.ajax({
        dataType: 'json',
        url: url,
        data : formData,
        type : "POST",
        enctype : "multipart/form-data" , 
        processData : false,
        contentType : false,
        success : function(data) {
            if (data.status == 1) {
                openAlertDialog("Success", "The Asset type has been deleted!", "Continue", "manage-assets");
            } else {
                openAlertDialog("Error", data.message, "Continue", "manage-assets");
            }
        },
        error : function(data) {
            openAlertDialog("Error", data.message, "Continue", "manage-assets");
        },
    });
}

1 Ответ

1 голос
/ 22 января 2020

Проблема с вашим запросом. Когда вы предоставляете массив assetID Query пытается вернуть список AssetCategory объектов. Но в настоящее время метод позволяет вернуть только один AssetCategory объект. Вот почему ошибка возникает, когда вы передаете массив assetID. Поэтому вы должны изменить тип возвращаемого значения метода getAssetInfo, как показано ниже:

@Query("From AssetCategory A WHERE A.assetID IN (:assetID)")
public List<AssetCategory> getAssetInfo(@Param("assetID") String[] assetID);

Теперь метод getAssetInfo возвращает список AssetCategory объектов. Это означает, что вы сейчас передаете List<AssetCategory> атрибуту DeleteCategoryObject модели. Поэтому вы должны внести необходимые изменения в ваш внешний интерфейс.

Теперь вы можете выполнить итерацию в интерфейсе, как показано ниже:

<form method="POST" name="deleteFormAdd" id="deleteFormAdd" enctype="multipart/form-data">
    <input type="hidden" name="_csrf" th:value="${_csrf.token}" />

    //The code can't iterate the String of array given by the GET
    <input type="hidden" class="assetId" th:each="deleteCategory, itemStat : ${DeleteCategoryObject}" th:name="|DeleteCategoryObject[__${itemStat.index}__].assetID|" th:value="${deleteCategory.assetID}"/>

    //This button is for submitting the String of array ID to be deleted
    <input type="button"  class="btn btn-primary btn-block" value="Yes" th:onclick="'javascript:submitForm(\'deleteFormAdd\',\''+@{/delete-asset}+'\')'" />
    <button type="reset" onclick="window.location.href = 'manage-assets.html';" class="btn btn-default btn-block"> Cancel</button>
</form>

Измените контроллер Post, как показано ниже:

@RequestMapping(value = "/delete-asset", method = RequestMethod.POST)
public @ResponseBody String deleteAsset(@ModelAttribute List<AssetCategory> assetCategories) {
    JsonObject result = new JsonObject();
    if (assetCategories != null && !assetCategories.isEmpty()) {
        String[] arr = new String[assetCategories.size()];
        for (int i =0; i < assetCategories.size(); i++) {
            arr[i] = assetCategories.get(i).getAssetID();
        }
        assetService.deleteAssets(arr);
        result.addProperty("result", "Success");
        result.addProperty("status", 1);
        result.addProperty("message", "Asset Deleted!");
    }
    return result.toString();
}

Функция отправки формы:

function submitForm(formID, url) {
var assetIdList = [];
var assetIdObj;
$("#" + formID).find('.assetId').each(function () {
    assetIdObj = {};
    assetIdObj.assetID = $(this).val();
    assetIdList.push(assetIdObj);
});

$.ajax({
    dataType: 'json',
    url: url,
    data: {assetCategories: assetIdList},
    type: "POST",
    enctype: "multipart/form-data",
    processData: false,
    contentType: false,
    success: function (data) {
        if (data.status === 1) {
            openAlertDialog("Success", "The Asset type has been deleted!", "Continue", "manage-assets");
        } else {
            openAlertDialog("Error", data.message, "Continue", "manage-assets");
        }
    },
    error: function (data) {
        openAlertDialog("Error", data.message, "Continue", "manage-assets");
    },
});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...