Ask Questions and Find Answers
Important:
Ask is now read-only. You can review any existing questions and answers, but not add anything new.
But - don't panic! While ask is no more, we've replaced it with discuss - the new Liferay Discussion Forum! Read more here here or just visit the site here:
discuss.liferay.com
RE: Cannot see custom API in API explorer
I have created a very simple REST service using the 'rest' template in Liferay Developer Studio amd deployed it to a local Liferay application server (Liferay DXP 2024 Q1.5). Here is the RestApplication code:
package banana.rest.application;
import java.util.Collections;
import java.util.Set;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Application;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.jaxrs.whiteboard.JaxrsWhiteboardConstants;
/**
*
* @author Daniel.Griffiths
*/
@Component(
property = {
JaxrsWhiteboardConstants.JAX_RS_APPLICATION_BASE + "=/banana-rest/banana",
JaxrsWhiteboardConstants.JAX_RS_NAME + "=banana.Rest"
},
service = Application.class
)
public class BananaRestApplication extends Application {
public Set<Object> getSingletons() {
return Collections.<Object>singleton(this);
}
@GET
@Produces("text/plain")
public String working() {
return "It works!";
}
@GET
@Path("/morning")
@Produces("text/plain")
public String hello() {
return "Good morning!";
}
@GET
@Path("/morning/{name}")
@Produces("text/plain")
public String morning(
@PathParam("name") String name,
@QueryParam("drink") String drink) {
String greeting = "Good Morning " + name;
if (drink != null) {
greeting += ". Would you like some " + drink + "?";
}
return greeting;
}
}
I can access this API by going to http://localhost:8080/o/banana-rest/banana (and the text 'It works!' is returned as expected) without a problem but when I go to 'http://localhost:8080/o/api', this API is not listed, only the built-in ones.
Am I correct in thinking that my custom API should be listed in the API explorer? If not, I have seen several posts regarding dependencies that you can add to JAX-RS web services to produce the OpenAPI documentation but it makes no mention of Liferay. What am I missing?
Hi,
You can try building Rest API through Rest builder then it will show up on API explorer.
You can refer
https://learn.liferay.com/w/dxp/headless-delivery/apis-with-rest-builder
Thanks for the response so I created a REST Builder project with the following openapi.yaml:
info:
description: "Simple API to test the inclusion in the built-in API explorer"
license:
name: "Apache 2.0"
url: "http://www.apache.org/licenses/LICENSE-2.0.html"
title: "AppleRest"
version: v1.0
openapi: 3.0.1
paths:
"":
get:
tags:
- "Service Endpoints"
operationId: working
responses:
200:
description: "Server contacted and results returned"
content:
text/plain:
schema:
type: string
example: "It works!"
"/morning":
get:
tags:
- "Service Endpoints"
operationId: hello
responses:
200:
description: "Server contacted and results returned"
content:
text/plain:
schema:
type: string
example: "Good morning"
"/morning/{name}":
get:
tags:
- "Service Endpoints"
operationId: morning
parameters:
- name: "name"
in: path
schema:
type: string
required: true
responses:
200:
description: "Server contacted and results returned"
content:
text/plain:
schema:
type: string
example: "Good morning Bob"
However, when I run the buildREST gradle task, I receive the following error:
Exception in thread "main" java.lang.RuntimeException: Error generating REST API
IllegalStateException occurred while parsing file src\main\java\apple\rest\internal\resource\v1_0\OpenAPIResourceImpl.java.
at com.liferay.portal.tools.rest.builder.RESTBuilder.main(RESTBuilder.java:119)
Caused by: com.puppycrawl.tools.checkstyle.api.CheckstyleException: IllegalStateException occurred while parsing file src\main\java\apple\rest\internal\resource\v1_0\OpenAPIResourceImpl.java.
at com.puppycrawl.tools.checkstyle.JavaParser.parse(JavaParser.java:105)
at com.liferay.portal.tools.java.parser.JavaParser._parse(JavaParser.java:973)
at com.liferay.portal.tools.java.parser.JavaParser.parse(JavaParser.java:82)
at com.liferay.portal.tools.java.parser.JavaParser.parse(JavaParser.java:69)
at com.liferay.portal.tools.java.parser.JavaParser.parse(JavaParser.java:63)
at com.liferay.portal.tools.rest.builder.internal.util.FileUtil._format(FileUtil.java:149)
at com.liferay.portal.tools.rest.builder.internal.util.FileUtil.write(FileUtil.java:142)
at com.liferay.portal.tools.rest.builder.RESTBuilder._createOpenAPIResourceFile(RESTBuilder.java:1015)
at com.liferay.portal.tools.rest.builder.RESTBuilder.build(RESTBuilder.java:261)
at com.liferay.portal.tools.rest.builder.RESTBuilder.main(RESTBuilder.java:108)
Caused by: java.lang.IllegalStateException: src\main\java\apple\rest\internal\resource\v1_0\OpenAPIResourceImpl.java:81:6: unexpected token: add
at com.puppycrawl.tools.checkstyle.JavaParser$1.reportError(JavaParser.java:93)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.typeDefinition(GeneratedJavaRecognizer.java:411)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.compilationUnit(GeneratedJavaRecognizer.java:202)
at com.puppycrawl.tools.checkstyle.JavaParser.parse(JavaParser.java:99)
... 9 more
Caused by: src\main\java\apple\rest\internal\resource\v1_0\OpenAPIResourceImpl.java:81:6: unexpected token: add
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.traditionalStatement(GeneratedJavaRecognizer.java:5628)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.statement(GeneratedJavaRecognizer.java:4397)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.compoundStatement(GeneratedJavaRecognizer.java:4063)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.field(GeneratedJavaRecognizer.java:3543)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.classBlock(GeneratedJavaRecognizer.java:2643)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.newExpression(GeneratedJavaRecognizer.java:7902)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.primaryExpression(GeneratedJavaRecognizer.java:4476)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.postfixExpression(GeneratedJavaRecognizer.java:7532)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.unaryExpressionNotPlusMinus(GeneratedJavaRecognizer.java:7461)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.unaryExpression(GeneratedJavaRecognizer.java:7276)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.multiplicativeExpression(GeneratedJavaRecognizer.java:7141)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.additiveExpression(GeneratedJavaRecognizer.java:7092)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.shiftExpression(GeneratedJavaRecognizer.java:7035)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.relationalExpression(GeneratedJavaRecognizer.java:6952)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.equalityExpression(GeneratedJavaRecognizer.java:6903)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.andExpression(GeneratedJavaRecognizer.java:6874)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.exclusiveOrExpression(GeneratedJavaRecognizer.java:6845)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.inclusiveOrExpression(GeneratedJavaRecognizer.java:6816)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.logicalAndExpression(GeneratedJavaRecognizer.java:6787)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.logicalOrExpression(GeneratedJavaRecognizer.java:6758)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.conditionalExpression(GeneratedJavaRecognizer.java:2237)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.assignmentExpression(GeneratedJavaRecognizer.java:6510)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.expression(GeneratedJavaRecognizer.java:4910)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.initializer(GeneratedJavaRecognizer.java:4753)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.varInitializer(GeneratedJavaRecognizer.java:4667)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.variableDeclarator(GeneratedJavaRecognizer.java:4640)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.variableDefinitions(GeneratedJavaRecognizer.java:1655)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.field(GeneratedJavaRecognizer.java:3480)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.classBlock(GeneratedJavaRecognizer.java:2643)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.classDefinition(GeneratedJavaRecognizer.java:634)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.typeDefinitionInternal(GeneratedJavaRecognizer.java:556)
at com.puppycrawl.tools.checkstyle.grammar.GeneratedJavaRecognizer.typeDefinition(GeneratedJavaRecognizer.java:389)
... 11 more
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':modules:apple-rest:apple-rest-impl:buildREST'.
> Process 'command 'C:\Other\jdk-11.0.2\bin\java.exe'' finished with non-zero exit value 1
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
OK. So I've sorted that now. The error was caused by having a blank space character in the tag element of the openapi.yaml.
It compiles, deploys and shows up in the API explorer without issue. Now I just have to work out how to apply this to an existing rest (not rest builder) project.....
Powered by Liferay™