这是我通过jsonapi在liferay中上传文档的代码。我正在文件里面添加文件。但它显示错误“没有与path / dlapp / add-file-entry关联的JSON Web服务操作”。我正在使用liferay 6.2.4 ga5。
由于
<html>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script>
$( document ).ready(function() {
$("#submit").click(function(e) {
e.preventDefault();
var formData = new FormData($(this)[0]);
$.ajax({
url: 'http://localhost:8080/api/jsonws/dlapp/add-file-entry?repositoryId=27058&folderId=34530&sourceFileName=Screenshot&mimeType=image/png&title=hello&description=test&changeLog=not',
type: 'POST',
data: formData,
async: false,
cache: false,
contentType: false,
enctype: 'multipart/form-data',
processData: false,
success: function (response) {
alert(response);
}
});
});
});
</script>
<form>
<input type="file" name="file"/>
<input type="button" value="submit" id="submit"/>
</form>
</html>
答案 0 :(得分:1)
您可能遇到LPS-31943。这是与此资源操作相关的已知问题。请使用修补工具升级到最新的修补程序版本。我在评论中看到用户声称这个问题仍然存在,尽管在某些版本的Chrome中关闭了错误。
当您从请求中缺少必需的数据时,最常见到此错误消息。假设您已完全修补,很可能您的数据对象不正确。即使您将数据作为查询参数发送(这可能是一个问题,具体取决于您的JSON WS属性),数据对象仍然是错误的,因此会给您错误消息。
首先,您是否有这样一种特殊原因来调用服务?我相信只使用HTML
就可以获得更好的结果<form action="http://localhost:8080/api/jsonws/dlapp/add-file-entry" method="POST" enctype="multipart/form-data">
<input type="hidden" name="repositoryId" value="27058"/>
<input type="hidden" name="folderId" value="34530"/>
<input type="hidden" name="title" value="hello"/>
<input type="hidden" name="description" value="test"/>
<input type="hidden" name="changeLog" value="not"/>
<input type="file" name="file"/>
<input type="submit" value="addFileEntry(file)">Submit</input>
</form>
此代码取自official Liferay knowledge base,并根据您的具体示例进行调整。如果您坚持使用jQuery,则需要对数据对象进行字符串化。我会做这样的事情。
<html>
<head></head>
<body>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script>
$( document ).ready(function() {
$("#submit").click(function(e) {
e.preventDefault();
var formData = JSON.stringify($("form:first").serializeArray());
$.ajax({
url: 'http://localhost:8080/api/jsonws/dlapp/add-file-entry',
type: 'POST',
data: formData,
async: false,
cache: false,
contentType: false,
enctype: 'multipart/form-data',
processData: false,
success: function (response) {
alert(response);
}
});
});
});
</script>
<form>
<input type="hidden" name="repositoryId" value="27058"/>
<input type="hidden" name="folderId" value="34530"/>
<input type="hidden" name="title" value="hello"/>
<input type="hidden" name="description" value="test"/>
<input type="hidden" name="changeLog" value="not"/>
<input type="file" name="file"/>
<input type="button" value="submit" id="submit"/>
</form>
</body>
</html>
如果从外部应用程序调用此服务,则上面的示例很好。但是,如果您从门户网站(例如JavaScript portlet)中调用它,我肯定会使用Liferay的JavaScript API和AlloyUI标记库。
Liferay.Service(
'/dlapp/add-file-entry',
{
repositoryId: 12345,
folderId: 2345,
sourceFileName: 'Screenshoot',
mimeType: '',
title: '',
description: '',
changeLog: '',
cmd: {"/dlapp/add-file-entry":{}},
file: null
},
function(obj) {
console.log(obj);
}
);
此外,如果您正在构建新的东西,您将使用Liferay 7或DXP,因为它更新。