Java Ajax POST删除多个同名项目Spring MVC

Java Ajax POST删除多个同名项目Spring MVC,java,ajax,spring,spring-mvc,post,Java,Ajax,Spring,Spring Mvc,Post,我正在尝试删除web应用中多个同名的项目。但是当我写这篇文章时,它给了我一个错误500 这是我的表格代码 <form method="POST" name="deleteFormAdd" id="deleteFormAdd" enctype="multipart/form-data"> <input type="hidden" name="_csrf" th:value="${_csrf.token}" />

我正在尝试删除web应用中多个同名的项目。但是当我写这篇文章时,它给了我一个错误500

这是我的表格代码

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

                <!--Asset ID set to hidden so the User can't see it-->
                <input type="hidden" th:each="deleteCategory, itemStat : ${DeleteCategoryObject}" 
                th:name="assetID" 
                th:value="${deleteCategory.assetID}"/>

                <!-- For showing all the Asset to be deleted -->
                <input class="w3-input w3-border w3-round-large" type="text" 
                th:each="deleteCategory, itemStat : ${DeleteCategoryObject}" 
                th:name="${DeleteCategoryObject[__${itemStat.index}__].assetType}" 
                th:value="${deleteCategory.assetType}" 
                disabled="disabled"/>  

                <br></br>
                <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>
弹簧控制器

    @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();
}
春刀

    @Query("Delete From AssetCategory A WHERE A.assetID IN (:assetID)")
public AssetCategory deleteAssets(@Param("assetID") String[] assetID);
弹簧控制台错误

无法实例化[java.util.List]:指定的类是接口],根本原因是 org.springframework.beans.beans实例化异常:未能实例化[java.util.List]:指定的类是接口

这是表单数据(它包含资产ID)


您的ajax功能似乎存在问题。请检查以下内容:

function submitForm(formID, url) {
var assetIdList = [];
var assetIdObj;
$("#" + formID).find('input[name="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");
    },
});
}
从以下位置更新此html代码:

<input type="hidden" th:each="deleteCategory, itemStat : ${DeleteCategoryObject}" 
            th:name="assetID" 
            th:value="${deleteCategory.assetID}"/>

为此:

<input type="hidden" th:each="deleteCategory, itemStat : ${DeleteCategoryObject}" 
            name="assetID" 
            th:value="${deleteCategory.assetID}"/>

您的ajax功能似乎存在问题。请检查以下内容:

function submitForm(formID, url) {
var assetIdList = [];
var assetIdObj;
$("#" + formID).find('input[name="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");
    },
});
}
从以下位置更新此html代码:

<input type="hidden" th:each="deleteCategory, itemStat : ${DeleteCategoryObject}" 
            th:name="assetID" 
            th:value="${deleteCategory.assetID}"/>

为此:

<input type="hidden" th:each="deleteCategory, itemStat : ${DeleteCategoryObject}" 
            name="assetID" 
            th:value="${deleteCategory.assetID}"/>

您使用的是
多部分/表单数据
。因此,您的请求头具有
multipart/formdata
内容类型,其中数据作为表单类型。like键=值

因此,只需删除
@modeldattribute
注释,并将
消费
属性添加到映射注释中

//如果您使用的spring版本超过了4.3,请使用以下@PostMapping以提高可读性
//@PostMapping(value=“/delete asset”,consumes=MediaType.MULTIPART\u FORM\u DATA\u value)
@RequestMapping(value=“/delete asset”,method=RequestMethod.POST,consumes=MediaType.MULTIPART\u FORM\u DATA\u value)
public@ResponseBody字符串deleteAsset(列出资产类别){
JsonObject结果=新建JsonObject();
//您可以使用apache的commons集合
if(收款项不为空(资产类别)){
//您还可以使用流api
字符串[]arr=assetCategories.stream()
.map(AssetCategory::getAssetID)
.toArray();
资产服务。删除资产(arr);
结果。添加属性(“结果”、“成功”);
结果。添加属性(“状态”,1);
addProperty(“消息”,“资产已删除!”);
}
返回result.toString();
}

您使用的是
多部分/表单数据
。因此,您的请求头具有
multipart/formdata
内容类型,其中数据作为表单类型。like键=值

因此,只需删除
@modeldattribute
注释,并将
消费
属性添加到映射注释中

//如果您使用的spring版本超过了4.3,请使用以下@PostMapping以提高可读性
//@PostMapping(value=“/delete asset”,consumes=MediaType.MULTIPART\u FORM\u DATA\u value)
@RequestMapping(value=“/delete asset”,method=RequestMethod.POST,consumes=MediaType.MULTIPART\u FORM\u DATA\u value)
public@ResponseBody字符串deleteAsset(列出资产类别){
JsonObject结果=新建JsonObject();
//您可以使用apache的commons集合
if(收款项不为空(资产类别)){
//您还可以使用流api
字符串[]arr=assetCategories.stream()
.map(AssetCategory::getAssetID)
.toArray();
资产服务。删除资产(arr);
结果。添加属性(“结果”、“成功”);
结果。添加属性(“状态”,1);
addProperty(“消息”,“资产已删除!”);
}
返回result.toString();
}

但它给了我一个错误500,需要注意的是,这意味着服务器端出现了问题(在您的例子中是Spring)。请查看spring日志以获得更多线索,我怀疑可能是删除过程本身而不是ajax。您在spring控制台上收到了一条错误消息。张贴它。(另外,使用
列表
;这对每个人来说都比较容易。)我更新了帖子,并将错误包含在控制台中,可能与此无关,但。。。。为什么
deleteAssets(@Param(“assetID”)字符串[]assetID)
返回
AssetCategory
的实例(与
void
列表相对,例如从哪里获得该实例)?查看
@Query
@Modifying
deleteBy
之间的差异-有一个很好的总结。我在baeldung网站上更改了它。但它仍然显示了错误500,但它给了我一个错误500,需要注意的是,这意味着服务器端出现了问题(在您的例子中是Spring)。请查看spring日志以获得更多线索,我怀疑可能是删除过程本身而不是ajax。您在spring控制台上收到了一条错误消息。张贴它。(另外,使用
列表
;这对每个人来说都比较容易。)我更新了帖子,并将错误包含在控制台中,可能与此无关,但。。。。为什么
deleteAssets(@Param(“assetID”)字符串[]assetID)
返回
AssetCategory
的实例(与
void
列表相对,例如从哪里获得该实例)?查看
@Query
@Modifying
deleteBy
之间的差异-有一个很好的总结。我在baeldung网站上更改了它。但它仍然显示错误500。