Hi Ben

I followed your suggestions and was able to get rest working with
tapestry-resteasy without using persistence. However when I added agrest
tapestry resteasy threw an exception unknown class type:
io.agrest.runtime.AgRuntime. My code is as follows. I am using a simple
data model from https://github.com/agrestio/agrest-bookstore-example .
Could you please check I have implemented your suggestions correctly.

 - add tapestry-resteasy to your project

<dependency>
    <groupId>org.tynamo</groupId>
    <artifactId>tapestry-resteasy</artifactId>
    <version>0.7.0</version>
</dependency>

 - write a service to setup the AgRuntime

public class AgrestServiceImpl implements AgrestService {
  public AgrestServiceImpl() {
    ServerRuntime runtime = 
ServerRuntime.builder().addConfig("cayenne-project.xml").build();
    AgCayenneModule cayenneExt = AgCayenneBuilder.build(runtime);
    agRuntime = new AgBuilder().module(cayenneExt).build();
  }
  private AgRuntime agRuntime;
  public AgRuntime agRuntime() {
    return agRuntime;
  }
}


 - write a simple resource with a single @GET method using Agrest

@Path("/category")
@Produces(MediaType.APPLICATION_JSON)
public class CategoryResource {
  @Context
  private Configuration config;
  @GET
  public DataResponse<Category> getAll(@Context UriInfo uriInfo) {
      return Ag.select(Category.class, config).uri(uriInfo).get();
  }
}


 - contribute the AgRuntime and resource like in my previous mail.

    @Contribute(javax.ws.rs.core.Application.class)
    public static void configureRestProviders(Configuration<Object> singletons, 
AgrestService svcAgrest) {
        singletons.add(svcAgrest.agRuntime());
        singletons.addInstance(CategoryResource.class);
    }


 - test it with your browser or curl

http://localhost:8089/tapestry-agrest/rest/category

java.lang.RuntimeException: Exception constructing service 
'ResteasyRequestFilter': Error invoking constructor public 
org.tynamo.resteasy.ResteasyRequestFilter(java.lang.String,org.slf4j.Logger,org.apache.tapestry5.http.services.ApplicationGlobals,javax.ws.rs.core.Application,org.apache.tapestry5.ioc.services.SymbolSource,boolean,org.apache.tapestry5.ioc.services.UpdateListenerHub,long,long,boolean)
 throws javax.servlet.ServletException: Application.getSingletons() 
returned unknown class type: io.agrest.runtime.AgRuntime


On 3/8/21 22:06, Ben Weidig wrote:
> tapestry-resteasy is just bringing RESTEasy to Tapestry.
> There's no dependency to JPA/Hibernate.
> Do you mean the PersistenceService in the example on the page under "Code
> your singleton resource"?
> That's not a necessity, just an example for a Rest resource.
> In your case, you would use Agrest instead.
>
> You don't need to edit web.xml because tapestry-resteasy uses a Tapestry
> HttpServletRequestFilter to piggyback Tapstry itself, instead of going
> through the a custom servlet defined in the web.xml.
> Everything that would be done in the web.xml is done with code instead.
> This way, you don't need an extra Bridge to handle service injection.
>
> https://github.com/tynamo/tapestry-resteasy/blob/master/src/main/java/org/tynamo/resteasy/ResteasyRequestFilter.java
>
> The next steps for simple proof-of-concept would be something like this:
>
> - add tapestry-resteasy to your project
> - write a service to setup the AgRuntime
> - write a simple resource with a single @GET method using Agrest
> - contribute the AgRuntime and resource like in my previous mail.
> - test it with your browser or curl
>
> Hope this helps!
>
> On Tue, Aug 3, 2021 at 1:12 PM D Tim Cummings <t...@triptera.com.au.invalid>
> wrote:
>
>> Thanks for this very detailed reply. I will work through what you have
>> suggested and see how I go.
>>
>> I had a look at tapestry-resteasy but it seems to rely on hibernate or
>> jpa and I am using cayenne. I am not sure what is required for
>> org.tynamo.services.PersistenceService. Also tapestry-resteasy says I
>> don't need to edit web.xml.
>>
>> Another example I am following says I do need to edit web.xml.
>> https://github.com/andrus/wowodc13 is an example for tapestry and
>> cayenne and jersey 1.x rest. It seems to rely on a JerseyTapestryBridge
>> [1] but the code looks specific to jersey 1.x and wouldn't work with
>> jersey 2.x
>>
>> Cheers
>>
>> Tim
>>
>> [1]
>>
>> https://github.com/andrus/wowodc13/blob/master/site/src/main/java/demo/rest/jersey/JerseyTapestryBridge.java
>>
>> On 3/8/21 17:15, Ben Weidig wrote:
>>> Hi Tim,
>>>
>>> full disclosure: I haven't used Cayenne or Agrest, but I checked out
>> their
>>> documentation.
>>>
>>> I don't think there's anything Tapestry-specific needed to get it up and
>>> running except setting up Rest.
>>> They say in their docs that you still have to write your JAX-RS endpoints
>>> and do security yourself.
>>>
>>> For JAX-RS, there's tapestry-resteasy
>>> https://www.tynamo.org/tapestry-resteasy+guide/
>>> There are examples how to add Rest to Tapestry and register your
>> resources.
>>> The AgRuntime should be contributable just like a Rest resource. RestEasy
>>> treats many of its classes are contributable (Resources, Provider, etc.).
>>> You could create a service to build it.
>>>
>>> @Contribute(javax.ws.rs.core.Application.class)
>>> public static void configureRestProviders(Configuration<Object>
>> singletons,
>>> YourAgRuntimeBuilder builder) {
>>>     singletons.add(builder.build());
>>>     singletons.addInstance(YourCredentialsInterceptor.class);
>>>     singletons.addInstance(YourResource.class);
>>> }
>>>
>>> For security, we use custom headers containing an API key/secret that are
>>> validated by a javax.ws.rs.container.ContainerRequestFilter with
>>> @Priority(Priorities.AUTHENTICATION) and
>>> @Priority(Priorities.AUTHORIZATION) and plug in your security code.
>>>
>>> But as said before, I haven't tested it, and it just looks this way to me
>>> at first glance.
>>>
>>> Cheers,
>>> Ben
>>>
>>> On Tue, Aug 3, 2021 at 5:28 AM D Tim Cummings
>> <t...@triptera.com.au.invalid>
>>> wrote:
>>>
>>>> Does anyone have experience integrating Agrest (https://agrest.io/)
>> into
>>>> a Tapestry app? My Tapestry app uses Cayenne ORM and it looks like
>>>> Agrest works well with Cayenne to produce REST functionality. It would
>>>> be helpful to see some sample code.
>>>>
>>>> Thanks in advance
>>>>
>>>> Tim
>>>>
>>>>
>>>>
>>>>
>>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to