RE: Cannot see custom API in API explorer

thumbnail
Jamie Sammons, modified 1 Year ago. New Member Posts: 12 Join Date: 6/25/20 Recent Posts

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?

thumbnail
Mohammed Yasin, modified 1 Year ago. Liferay Master Posts: 593 Join Date: 8/8/14 Recent Posts

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

 

thumbnail
Jamie Sammons, modified 1 Year ago. New Member Posts: 12 Join Date: 6/25/20 Recent Posts

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

 

thumbnail
Jamie Sammons, modified 1 Year ago. New Member Posts: 12 Join Date: 6/25/20 Recent Posts

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.....