REST Problem - Could not write JSON document - Infinite recursion (StackOverflowError)

Hi,

My project attached.

My goal is to create a complete customized controller CRUD REST API.

I have created a Page entity and Repository / Service / Controller layers.

After start the application, using Postman I have added a value like this:

POST http://localhost:8080/app/rest/v2/entities/arc$Page
Body below
{
“_entityName”: “arc$Page”,
“id”: “1”,
“pageableType”: “PageableType_01”,
“name”: “Page_01”,
“theme”: “Theme_01”,
“pageableId”: 1
}

It works when I use this GET
http://localhost:8080/app/rest/v2/entities/arc$Page

But when I use my customized GET
http://localhost:8080/app/rest/pages/

the error below happens:


20:42:32.653 WARN  o.s.w.s.m.s.DefaultHandlerExceptionResolver - Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON document: Infinite recursion (StackOverflowError) (through reference chain: com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$UnmodifiableMap["arc$Page"]->com.haulmont.chile.core.model.impl.MetaClassImpl["model"]->com.haulmont.chile.core.model.impl.MetaModelImpl["classByName"]->java.util.Collections$Unmo

:evergreen_tree: The text has been truncated to the first 30000 characters.

arc.zip (30.1K)

Hi, the problem here is that Entity in the platform is a very complex object and has a lot of system attributes. Default jackson serializer, that is used when you just return an object from the controller, cannot handle it.
You have two options here:

  1. Do like we did for the standard rest api - operate with strings, not the object. So we get json as a string argument and return the string when the method result is an entity. Take a look at the com.haulmont.restapi.controllers.EntitiesController class. Serialization and deserialization is done with the help of the com.haulmont.cuba.core.app.serialization.EntitySerializationAPI.
  2. Use not the entities, but simple POJOs as DTOs. In this case, you can safely return it from the controller methods, pass it as method arguments, you’ll just need to implement the conversion between the POJO and platform entity.

About the URL, you can create your own Spring MVC dispatcher context with its own prefix. In the web.xml file of the web module take a look at how rest_api or dispatcher servlets are registered.

Thank you for your reply Max!
Can you put what you said in a small example ?
I have changed the url-patterns in the web.xml but it did not work.
Can you show me what you said in a project using DTOs / JSON serialization ?
Best,
James

Hi,
There is a project attached. Take a look at the com.company.rs.myapi.MyCustomController. It returns a list of entities by the requests http://localhost:8080/app/rest/myapi/books and http://localhost:8080/app/rest/myapi/books2
Two methods in the controller demonstrate two approaches I mentioned above.

rest-sample.zip (28.9K)

Thanks a lot for clarifying Max!

Using Cuba would I be able to create requests like this http://localhost:8080/app/myapi/books (removing the rest) or http://localhost:8080/books (removing app/api) ? You said I could do it changing web.xml but I tried without success.

Can you send me a web.xml file with an example as well ?

Thanks a lot again