Thanks for your help!
Below you can see my controller which is basically the Spring Boot "Hello
World" REST example, plus my Cayenne test.
When I access http://localhost:8080/greeting, I get the JSON result below:
{"id":1,"content":"Hello, World!"}
When I access http://localhost:8080/recipe/id=15, I'm directed to a Spring
Boot default error page. But in the log I can see that Cayenne works fine,
the object is fetched as it should.
*// SPRING BOOT LOG*
2018-01-09 21:41:04.733 INFO 6128 --- [io-8080-exec-38]
o.a.cayenne.log.CommonsJdbcEventLogger : Detected and installed adapter:
org.apache.cayenne.dba.mysql.MySQLAdapter
2018-01-09 21:41:04.734 INFO 6128 --- [io-8080-exec-38]
o.a.cayenne.log.CommonsJdbcEventLogger : --- transaction started.
2018-01-09 21:41:04.930 INFO 6128 --- [io-8080-exec-38]
o.a.cayenne.log.CommonsJdbcEventLogger : SELECT `t0`.`Comment`,
`t0`.`ID`, `t0`.`ID_privileges`, `t0`.`Instruction`, `t0`.`Name`,
`t0`.`No_of_servings`, `t0`.`Rating`, `t0`.`Source`, `t0`.`Timestamp`,
`t0`.`Username` FROM `foodbase`.`recipes` `t0` WHERE `t0`.`ID` = ? [bind:
1->ID:13]
2018-01-09 21:41:05.338 INFO 6128 --- [io-8080-exec-38]
o.a.cayenne.log.CommonsJdbcEventLogger : === returned 1 row. - took 579
ms.
2018-01-09 21:41:05.339 INFO 6128 --- [io-8080-exec-38]
o.a.cayenne.log.CommonsJdbcEventLogger : +++ transaction committed.
2018-01-09 21:41:05.642 WARN 6128 --- [io-8080-exec-38]
.w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message:
org.springframework.http.converter.HttpMessageNotWritableException: Could
not write JSON: No serializer found for class
org.apache.cayenne.tx.TransactionFilter and no properties discovered to
create BeanSerializer (to avoid exception, disable
SerializationFeature.FAIL_ON_EMPTY_BEANS); nested exception is
com.fasterxml.jackson.databind.JsonMappingException: No serializer found
for class org.apache.cayenne.tx.TransactionFilter and no properties
discovered to create BeanSerializer (to avoid exception, disable
SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain:
model.Recipes["objectContext"]->org.apache.cayenne.access.DataContext["channel"]->org.apache.cayenne.access.DataDomain["filters"]->java.util.Collections$UnmodifiableRandomAccessList[0])
2018-01-09 21:41:05.965 ERROR 6128 --- [io-8080-exec-38]
o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet
dispatcherServlet threw exception
I have tested also to disable SerializationFeature.FAIL_ON_EMPTY_BEANS, as
suggested in the exception, with no luck.
*// Class GreetingController*
package hello;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.configuration.server.ServerRuntime;
import org.apache.cayenne.configuration.server.ServerRuntimeBuilder;
import org.apache.cayenne.query.ObjectSelect;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import model.Recipes;
import model.auto._Recipes;
@RestController
public class GreetingController {
// Cayenne context
ServerRuntime cayenneRuntime =
ServerRuntimeBuilder.builder().addConfig("cayenne-project.xml").build();
ObjectContext context = cayenneRuntime.newContext();
// Hello World example variables
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name",
defaultValue="World") String name) {
return new Greeting(counter.incrementAndGet(),
String.format(template, name));
}
@RequestMapping("/recipe")
public Recipes getRecipe(@RequestParam(value="id") int id) {
List <Recipes> recipesList =
ObjectSelect.query(Recipes.class).where(Recipes.ID.eq(new
Long(id))).select(context);
return recipesList.get(0);
}
}
2018-01-09 9:00 GMT+01:00 Andrus Adamchik <[email protected]>:
> To clarify, I realize you are using Spring, but Spring is many things. So
> maybe you can post here the relevant code (of a REST endpoint?), so that we
> can advise on serialization.
>
> Andrus
>
>
> > On Jan 9, 2018, at 10:04 AM, Andrus Adamchik <[email protected]>
> wrote:
> >
> > What technology are you using to serialize your data to JSON? Do you
> have a code example?
> >
> > Andrus
> >
> >
> >> On Jan 9, 2018, at 9:24 AM, Fredrik Widengren <
> [email protected]> wrote:
> >>
> >> Hello Frank
> >> Thanks for your mail.
> >> They automatically included when running Spring Boot as I understand.
> Also the ”Hello World” example is running fine, and that one returns the
> answer in JSON.
> >>
> >> /Fredrik
> >>
> >> Skickat från min iPhone
> >>
> >>> 8 jan. 2018 kl. 23:07 skrev Frank Herrmann <frank.herrmann@
> modernizingmedicine.com>:
> >>>
> >>> Do you have the Jackson libraries included in your project? They are
> >>> normally needed for JSON serialization/deserialization.
> >>>
> >>> On Mon, Jan 8, 2018 at 4:52 PM, Fredrik Widengren <
> >>> [email protected]> wrote:
> >>>
> >>>> Hello,
> >>>>
> >>>> I'm testing to setup Cayenne with Spring Boot. I have created a simple
> >>>> REST service. Spring is working fine with a Hello World example from
> >>>> Spring.io.
> >>>>
> >>>> When I try to send back my cayenne objects that I have generated from
> >>>> the Cayenne modeller, I get an exception that it can’t find a JSON
> >>>> serializer.
> >>>>
> >>>> Error:
> >>>> Could not write JSON: No serializer found for class
> >>>> org.apache.cayenne.tx.TransactionFilter
> >>>>
> >>>> I have read that a common reason for this is that the class that you
> >>>> try to serialize does not have any public getters/setters. The
> >>>> generated classes (in the auto package) from the modeller that extends
> >>>> CayenneDataObject do have these public getters/setters. The class is
> >>>> however abstract, but I'm using the class created by the modeller that
> >>>> extends the abstract modeller class.
> >>>>
> >>>> Anyone that have any experience from Cayenne and Spring that have some
> >>>> input?
> >>>>
> >>>> Many thanks!
> >>>>
> >>>> /Fredrik
> >>>>
> >>>
> >>>
> >>>
> >>> --
> >>> FRANK HERRMANN
> >>> SENIOR SOFTWARE ENGINEER
> >>>
> >>> T: 561-880-2998 x1563
> >>>
> >>> E: [email protected]
> >>>
> >>>
> >>>
> >>> [image: [ Modernizing Medicine ]] <https://www.modmed.com/>
> >>> [image: [ Facebook ]] <https://www.facebook.com/modernizingmedicine>
> [image:
> >>> [ LinkedIn ]] <https://www.linkedin.com/company/modernizing-medicine/>
> [image:
> >>> [ YouTube ]] <https://www.youtube.com/user/modernizingmedicine>
> [image: [
> >>> Twitter ]] <https://twitter.com/modmed> [image: [ Blog ]]
> >>> <https://www.modmed.com/BlogBeyondEMR> [image: [ Instagram ]]
> >>> <https://instagram.com/modernizing_medicine>
> >>>
> >>> [image: [ MOMENTUM 2017 ]] <https://www.eventproducers.
> events/momentum2017/>
> >
>
>