Mailing List webobjects-dev@wocommunity.org Message #36
From: Don Lindsay <webobjects-dev@wocommunity.org>
Subject: Re: [WO-DEV] ERRest PUT not functioning
Date: Thu, 4 Feb 2021 08:21:37 -0600
To: WebObjects & WOnder Development <webobjects-dev@wocommunity.org>
They are not part of the code.  They can be used but should not be needed, ERRest should configure the methods (as in the Wonder examples) and their routes from the code in the Application.


       ERXRouteRequestHandler restRequestHandler = new ERXRouteRequestHandler(ERXRouteRequestHandler.WO);
restRequestHandler.addDefaultRoutes(TileV2.ENTITY_NAME,TileV2.ENTITY_NAME,true, TileV2Controller.class);
restRequestHandler.addDefaultRoutes(DashboardV2.ENTITY_NAME,DashboardV2.ENTITY_NAME,true,DashboardV2Controller.class);
restRequestHandler.addDefaultRoutes(DashboardsTilesV2.ENTITY_NAME,DashboardsTilesV2.ENTITY_NAME,true,DashboardsTilesV2Controller.class);
restRequestHandler.addDefaultRoutes(Databasedetails.ENTITY_NAME,Databasedetails.ENTITY_NAME,true,DatabasedetailsController.class);
restRequestHandler.addDefaultRoutes("Driver");
restRequestHandler.addDefaultRoutes("TileQuery");
    ERXRouteRequestHandler.register(restRequestHandler);

I have changed to use the annotations at this point because I don’t have time to debug the Wonder code to find out what I may have done wrong or if there is a bug.

Many things are not working as I expected, and that may be errors on my part.  For instance after I mark a method as a put, or delete verbs, the json that is part of the body is not used in the create method of the for the entity when the server receives the http request.  But it does marshal the JSON for the post verb



On Feb 3, 2021, at 10:46, Peer Sandtner <webobjects-dev@wocommunity.org> wrote:

Ok, i know about annotations in general, but I was not aware, that ERRest supports it.
And especially: These annotations are not part of your example code (TileV2Controller.java)

Or do I miss something?

Peer


Am 03.02.2021 um 16:07 schrieb Don Lindsay <webobjects-dev@wocommunity.org>:

Hello Peer;

There are annotations that can be used to mark methods for specific http verbs (@GET, @PUT, @POST, etc) it is combined with the @Path annotation which is passed a value for the path to the method (/TileV2, /TileV2/Delete, etc).  I think it is a way to do route creation without multiple lines of java code, like you showed.

Thanks

Don

On Feb 3, 2021, at 07:40, Peer Sandtner <webobjects-dev@wocommunity.org> wrote:

Ah, yes. Sorry, I was blind.

I am in development mode right now.  I see the put coming into the server and I can get it to go to the method using the @PUT annotation with the @PATH, but the json never gets put into a key so I can’t get the object to update.

"using the @PUT annotation with the @PATH"? What do you mean by that? Hm, excuse my stupidity...

How do you configure your ERXRouteRequestHandler? Something like in er.rest.example.Application (ERRestRouteExample)? I'm always doing something like:

ERXRouteRequestHandler routeRequestHandler = new ERXRouteRequestHandler(ERXRouteRequestHandler.WO);
routeRequestHandler.addRoute(new ERXRoute(Person.ENTITY_NAME, "/Person/{person:Person}", ERXRoute.Method.Put, PersonController.class, "update"));

regards,
Peer



Am 03.02.2021 um 09:40 schrieb Don Lindsay <webobjects-dev@wocommunity.org>:

Hello;

I am in development mode right now.  I see the put coming into the server and I can get it to go to the method using the @PUT annotation with the @PATH, but the json never gets put into a key so I can’t get the object to update.

Thanks,

Don

On Feb 3, 2021, at 02:17, Peer Sandtner <webobjects-dev@wocommunity.org> wrote:

Hello Don,

are you using an Apache? In my case I had to modify webobjects.conf:

# Specific to Apache 2.4
<Location /cgi-bin/WebObjects/>
    <Limit GET POST PUT OPTIONS >
      Require all granted
    </Limit>
    Require all denied
</Location>   

Peer



Am 03.02.2021 um 07:21 schrieb Don Lindsay <webobjects-dev@wocommunity.org>:

Hello;

I have a ERRest project. Everything seems to be working except for when I update an entity the updateAction never gets called.  I put breakpoints in the source code on createAction, updateAction, indexAction, showAction. The method that gets called for PUT is indexAction.  Am I doing something wrong with the code, I took a look at the example apps in Project Wonder and used them to create my boilerplate.
  
Thanks,

Don


The request from the developer tools in the browser:

<PastedGraphic-1.png>


How the data is being sent:

$.ajax({
url: '/cgi-bin/WebObjects/xxxxxx.woa/ra/TileV2',
type: ‘PUT',
data: workingObject,
dataType: 'json',
contentType: 'application/json',
success: function (data) {
comp._currentTile = data;
console.log(JSON.stringify(data))
bootbox.alert({
title: "Tile Save",
message: "Tile saved successfully",
centerVertical: true
});
comp.resetDirty();
comp.initialize(window.connectorsjson, window.tilejson);;
},
error: function (data) {
bootbox.alert({
title: "Tile Save",
message: "Saving the tile failed, please try again later",
centerVertical: true
});
}
});



TileV2Controller.java

public class TileV2Controller extends BaseRestController {

public TileV2Controller(WORequest request) {
super(request);
// TODO Auto-generated constructor stub
}

@Override
public WOActionResults createAction() throws Throwable {
TileV2 tilev2 = create(createInFilter());
editingContext().saveChanges();
return response(tilev2,outFilter());
}

public ERXKeyFilter createInFilter() {
return ERXKeyFilter.filterWithAttributes();
}

public ERXKeyFilter outFilter() {
ERXKeyFilter out = createInFilter();
return out;
}



/**
* Returns the value of the "tile" variable from the route.
* @return
*/
public TileV2 tilev2() {
TileV2 tilev2 = routeObjectForKey("tileV2");
tilev2.setTenant(((com.mozaic.app.Session)session()).getTenant());
return tilev2;
}

/**
* The query filter is used in indexAction to control what attributes and relationships
* you expose to qualifiers through query parameters
* @return
*/
public static ERXKeyFilter queryFilter() {
ERXKeyFilter filter = ERXKeyFilter.filterWithAllRecursive();
filter.includeAll();
return filter;
}

/**
* This showFilter is used by indexAction and showAction and says to return all attributes
* of an TileV2, and for the owner, include all of its attributes. 
*/
public static ERXKeyFilter showFilter() {
ERXKeyFilter filter = ERXKeyFilter.filterWithAttributes();
return filter;
}

/**
* The updateFilter is used by updateAction and createAction and says to allow updating any attributes of an
* TileV2.
* @return
*/
public static ERXKeyFilter updateFilter() {
ERXKeyFilter filter = ERXKeyFilter.filterWithAttributes();
return filter;
}

@Override
public WOActionResults updateAction() {
TileV2 tilev2 = tilev2();
update(tilev2, updateFilter());
editingContext().saveChanges();
return response(tilev2, showFilter());
}

@Override
public WOActionResults destroyAction() throws Throwable {
TileV2 tilev2 = tilev2();
tilev2.delete();
editingContext().saveChanges();
return response(tilev2, showFilter());
}

@Override
public WOActionResults newAction() throws Throwable {
TileV2 tilev2 = TileV2.createTileV2(editingContext(), "New Description", null, "New Tile",  ((com.mozaic.app.Session)session()).getTenant());
return response(tilev2, showFilter());
}

@Override
public WOActionResults showAction() {
return response(tilev2(), showFilter());
}

/**
* indexAction uses an ERXRestFetchSpecification, which optionally allows you to expose sorting, qualifying, and batching in query parameters 
*/
@Override
public WOActionResults indexAction() {
if (isSchemaRequest()) {
return schemaResponse(showFilter());
}
ERXRestFetchSpecification<TileV2> fetchSpec = new ERXRestFetchSpecification<>(TileV2.ENTITY_NAME, null, null, queryFilter(), TileV2.NAME.ascs(), 25);
return response(fetchSpec, showFilter());
}


}







Subscribe (FEED) Subscribe (DIGEST) Subscribe (INDEX) Unsubscribe Mail to Listmaster