Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
  • Jun 26 2017 20:07
    @remmeier banned @hibaymj
James Cole
@jc92930
Hi guys, I have a Spring Cloud Gateway in front of a spring boot service and a spring boot crnk service. The gw is called with SSL and the services are http. The Spring Boot service works fine. The Crnk service gives an error:
java.lang.IllegalArgumentException: Illegal character in scheme name at index 4: http,https://api-downstream-notification/notificationsBackend/notifications/v1
at java.base/java.net.URI.create(URI.java:883) ~[na:na]
at io.crnk.core.engine.http.DefaultHttpRequestContextBase.getRequestUri(DefaultHttpRequestContextBase.java:24) ~[crnk-core-3.2.20200419165537.jar!/:na]
at io.crnk.servlet.internal.ServletRequestContext.computeBaseUrl(ServletRequestContext.java:93) ~[crnk-setup-servlet-3.2.20200419165537.jar!/:na]
at io.crnk.servlet.internal.ServletRequestContext.getBaseUrl(ServletRequestContext.java:200) ~[crnk-setup-servlet-3.2.20200419165537.jar!/:na]
at io.crnk.core.engine.internal.http.HttpRequestContextBaseAdapter.<init>(HttpRequestContextBaseAdapter.java:28) ~[crnk-core-3.2.20200419165537.jar!/:na]
I saw this mentioned in December but a resolution was not clear...
Any help would be HUGELY appreciated! :)
James Cole
@jc92930
Anyone? @remmeier ?
Alexander Matthiesen
@alexander-matthiesen
Regarding crnk-gen: Is it possible to define examples and override the description inside of the template? Currently we are using it for generating our OpenAPI-Specification but we cannot override description inside of the "paths:" element. Do you have a suggestion how to do that? (we are using spring)
Our solution is to amend the file manually after the generation.
1 reply
tomivargek
@tomivargek

Hi,
we are using Java EE,crnk and Weblogic. We are having problems with generated links (self,relationship, next,prev, etc). When we go through load balancer or proxy, links aren't properly generated. For instance
[https://testEnvironment/_wsE122_model-info/ordering/orders?page[limit]=10] (link without load balancer) => generated links are okay
[https://loadBalancerLink/v1/model-info/ordering/orders?page[limit]=10] (link with load balancer/proxy) => generated links aren't proper, they are like this: [https://testEnvironment/_wsE122_model-info/ordering/orders...).

The problem is links aren't masked (generated) properly. We can't use X-Forward-Headers.. and we were unsuccessful overriding domain-name (crnk resource domain name).

Can you give us any possible solution for this (explain how exactly to override domain name or give us some other proposition of solution)?
Does crnk support using of "Referer" header (that would be great for us)?

whgibbo
@whgibbo

Hi,
Just wanted to ask a quick question regarding validation of the include parameter and expected responses to the following:

  • {url}?include=unknownattr
  • {url}?include[unknownResource]=unknownattr

I know for the first, it seems to ignore it.. But was expecting a BadRequest.
Are the unit tests for these ?

3 replies
filethirteen
@filethirteen
Anyone experience this? When using CrnkClient and expecting an error to be returned, why do all of the error details except for the error.detail field get lost. I tried adding a listener to the httpAdapter and just did a little log statement in both of the OnRequest and OnResponse methods and OnResponse is never invoked when the call results in an exception, like 400 Bad Request. Instead it seems as soon as CrnkClient receives the error it immediately throws it's own exception of that type and the only field it takes from the errors is detail, all the other fields get lost. Makes it kind of hard to propagate things like custom codes in the code field for example. My current workaround for this is jam all necessary info into the error detail and then extract it where needed. Does anyone else know of any way to preserve error detail when using CrnkClient?
Remo
@remmeier
@filethirteen errors are mapped by the ExceptionMapper, so any kind of functionality is possible. CrnkMappableException can hold ErrorData. So in principle it would allow to hold any kind of data if the exception is dervied from it.
logic starts in ClientStubBase.handleError. improvements in the area more than welcome. Just recently added the url to CrnkException to allow also holding the called url to reproduce it manually in the browser.
Remo
@remmeier
/all FYI: crnk 3.3 has been released with a variety of incremental improvements: http://www.crnk.io/releases/stable/
Rehab Reda
@rehab-reda0
Hi Remo can we use dynamodb with crnk ?
Tikaro
@0-Tikaro
Hey guys, does Crnk support filtering by empty relationships? Say I've got entities 'person' and 'group' , where group can have 0..N people, and I want to find only the groups with 0 people. Tried filter[person]=null and various derivatives of that, but that doesn't seem to be working.
Remo
@remmeier
@rehab-reda0 sure. you can implement a repository and map QuerySpec to native dynamodb queries. not unlike crnk-data-jpa.
@0-Tikaro not as of yet with the built-in filtering. but new FilterOperator can be defined to adress it
Romain LE BARO
@scandinave
HI, I try to integrate CRNK with Spring Boot and Keycloak. My goal is to define authorizations inside keycloak and have CRNK to filter resources base on it. My approache consist of let the keycloak adapter to handle resources filtering and use CRKN to handle field-based and data-bases authorizations. Is it the best approaches? And how can i get the Keycloak token that contains user scopes and use it inside CRNK?
Remo
@remmeier
seems good. if you need access to http header or other thing, spring (boot) means like auto wiring should be om I think? nothing needed on crnk side? HttpRequestContextAware is the crnk mechanism to access headers
Romain LE BARO
@scandinave
I have some doubts with how implement security with CRNK. Another possibility i have, is to retrieve user scope and map it with CRNK security. But i dont know where to define this mapping that need to be process on each request :
Resource-based authorization: Don't know where ?

Field-based authorization: Implementing ResourceFilter as Spring @Component?

Data-based authorization: Inside SecurityConfigurer.config.setDataRoomFilter?
Remo
@remmeier
typically one sets up Spring Security. This will hook into the servlet engine. And crnk can just make use of HttpServletRequest.isUserInRole (built-in default). All that then has to be implemented manually is a SecurityConfigurer that will setup the mapping of Roles to actual resource authorizations (and potentially further dataroom one).
Romain LE BARO
@scandinave
If i do it with isUserInRole my application roles will be hardcoded inside the application and will need a rebuild/redeploy of the app if a role is added no? I need something more dynamic where scope are retrieve from the jwt provided by keycloak (I know how to do that ) and map with the crnk authorizations/querySpec .
Remo
@remmeier
adding a new role usually means changing the application itself, not? whereas adding/removing roles for users (and pass along with JWTs) is quite common. or does it work diffferently in your case?
duncanportelli
@duncanportelli
@remmeier when creating a resource, the JSON:API spec that multiple response codes are supported (https://jsonapi.org/format/#crud-creating-responses). I have a case where I want to return a 202 Accepted instead of a 201 Created. Is this supported with the current functionality in Crnk please?
maarten-cb
@maarten-cb

Hi! Has anyone been able to get an OR filter to work with relationships?
When I filter on two attributes, it works fine and I get results that match both conditions:

/things/thing?filter={
    "OR": [
        {"unassigned": true},
        {"active": true}
    ]
}

But when I add a relationships to the filter, it only returns the records matching the relationship condition. I can have a thousand unassigned records without an assignee relationship, but it will not return them.

/things/thing?filter={
    "OR": [
        {"unassigned": true},
        {"assignee": {"user_id": "13d012e6-57ae-11e9-8647-d663bd873d93"}}
    ]
}

Is there a trick to this, a workaround perhaps? I'm on crnk 3.3

@maarten-cb what kind of repository are you using? maybe jpa where inner joins could be an issue?
maarten-cb
@maarten-cb
@remmeier That's right! I'll log the query and see what's going on there. Thanks.
duncanportelli
@duncanportelli
Thanks @remmeier
maarten-cb
@maarten-cb
@remmeier You were correct. It's doing an inner join on assignees, which eliminates the chance of any records without an assignee relationship to be included. I'm not sure how to influence the query to make it a left join. Any ideas?
Romain LE BARO
@scandinave
@Remo yeah, in my case the role and it's authorisations are provided by a authorisations server ( keycloak ) and can be change without having to rebuild the application. I think I have found a way to do this by exploiting permissions inside token and map it with crkn resource and field filters.
Remo
@remmeier
@maarten-cb I think the jpa repository, its config or the executor allows to change the default join type. potentially we should im prove the strategy and automatically go to outer join for some use cases. this is actually already happening for sorting.
@scandinave if you think you need more flexibility, you can have a closer look at the security module. i thin it already allows reconfiguration at runtime. beyond that there is also the possibility to go a layer deeper and buld an own one. the basic filter api is quite generic and then security module is more of a reasonable default i would say.
Jochen Reinhardt
@JochenReinhardt
I have trouble with HTTP authentication.
I always get a 401, then a subsequent request with credentials included, is OK.
this means the client sends every request twice which is a performance penalty and causes extra-load on the server.
I learned today, that using a client context with the apache http client makes the extra requests disappear.
How would I add a context to the crnk client?
Jochen Reinhardt
@JochenReinhardt

In io.crnk.client.http.apache.HttpClientRequest, the request is executed without HTTP-Context.

@Override
    public HttpAdapterResponse execute() throws IOException {
        listeners.stream().forEach(it -> it.onRequest(this));
        HttpClientResponse response = new HttpClientResponse(impl.execute(requestBase));
        listeners.stream().forEach(it -> it.onResponse(this, response));
        return response;
    }

Is it a viable option to subclass HttpClientRequest and HttpClientAdapter in order to get an invocation with the same HttpContext every time?

maarten-cb
@maarten-cb
@remmeier I made a wrapper for JpaQueryFactory that allows the default JoinType to be overridden. It works! Thanks for your help.
duncanportelli
@duncanportelli
Good morning. I am looking to implement a custom way to return a different HTTP status code upon creating a resource based on the type of the resource. I managed to implement a custom HttpStatusBehavior which extends DefaultHttpStatusBehavior. I am trying to access the ResourceRegistry from within however even though I am implementing the ResourceRegistryAware, the ResourceRegistry is still not being set. Any ideas on how this can be achieved please?
Remo
@remmeier
@JochenReinhardt who is setting the necessary HTTP headers? Shouldnt they be set before making the first request?
@duncanportelli if you make use of spring boot or something similar, you can just inject it with the regular means. Otherwise a need of CrnkBoot/ModuleRegistry might be required to make sure ResourceRegistryAware is honored.
Sebastian Wyrazik
@swyrazik
Hi! Does Crnk support sorting by @Transient Entity fields? It doesn't seem to work out-of-the-box.
For example, I'd like to sort by the sum of two normal attributes.
Mikael Blomström
@mikaelblomstrom
Thank you @remmeier for approving crnk-project/crnk-framework#579 much appreciated!
Remo
@remmeier
thank you for the change! could you rebase to resolve the merge conflict?
@swyrazik what kind of support are you looking in for? in general no, as of yet, it is left to JPA.
Sebastian Wyrazik
@swyrazik

First I'm looking for a way to use transient fields as sort parameters, meaning that Crnk would accept them in the first place. It seems that only actual fields can be used for sorting, unless I'm missing something.

Then there is the problem of translating a transient field to its corresponding JPA query. I wasn't actually expecting that that would work without some kind of customization, but I was wondering if there is some way to tell Crnk how a field is supposed to be mapped to a JPA query. For example, having the following in an Entity:

@Transient
public int getTotal() {
    return a + b;
}

I would want to translate that into order by (o.a + o.b). Maybe Hibernate's @Formula could be used in this case.

Is there any way I could configure Crnk to allow any of the above? Any pointers on where I should look into, without having to modify the Crnk source code?

Martin
@EmDee

Hi there!

I'm trying to use crnk-gen to generate Java models and interfaces for my JSON:API schema.

I've followed the setup described in https://www.crnk.io/releases/stable/documentation/#_openapi, but run into a dependency problem with XML-doclet (https://github.com/MarkusBernhardt/xml-doclet). It complains about not being able to install that dependency, apparently because no repo has been defined.

I then downloaded the example app and added the plugin part in my gradle:

apply plugin: 'crnk-gen'
crnkGen {
    runtime {
        // Gradle classpath configuration to use
        configuration = 'runtime'
    }

    // fork generation into new process to have clean environment
    forked = true

    // specify the package to look for resources
    resourcePackages = ['io.crnk.test']

    openapi {
        // enable OpenAPI generation within Gradle plugin
        enabled = true

        // specify name of openapi template in the build dir to merge onto
        templateName = "openapi-template.yml"

        // specify name of API to display in the generated OpenAPI file
        projectName = "Generated Title"

        // specify version of the API to display in the generated OpenAPI file
        projectVersion = "0.1.0"

        // specify name of openapi template in the build dir to merge onto
        projectDescription = "A generated description of the API."

        // specify location of generated sources
        genDir = file('src/resources')
    }
}
crnkGen.init()

However, I'm getting a Failed to apply plugin [class 'io.crnk.gen.gradle.DocletPlugin'].

Questions:

  1. Does crnk-gen support my use case, i.e. passing a openapi.json scheme and let it generate interfaces and models?
  2. Has anyone ran into above mentioned error?
Martin
@EmDee
Ok, I think I figured out how it works and it is not intended as an OpenAPI code generator.