我试图使用SpEL在这个文档中https://spring.io/blog/2014/07/15/spel-support-in-spring-data-jpa-query-definitions做一个查询过滤结果?#{principal.id}
问题是Spring返回一个异常
组织。冬眠QueryException:尚未设置所有命名参数:[1][从产品p JOIN p.store s JOIN p.category c中选择p、p.store、p.category,其中p.store.id=:id和p.KEYORD等p.KEYORD=?1];嵌套的例外是java。lang.IllegalArgumentException:org。冬眠QueryException:尚未设置所有命名参数:[1][从产品p JOIN p.store s JOIN p.category c中选择p、p.store、p.category,其中p.store.id=:id和p.keywords,如:keyword和p.store.ownerId=?1]
我已经设置了以下代码,并且正在执行。
@Service
public class SecurityEvaluationContextExtension extends EvaluationContextExtensionSupport {
@Override
public String getExtensionId() {
return "security";
}
@Override
public SecurityExpressionRoot getRootObject() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
System.out.println("SER >>>>> " + authentication.getPrincipal().toString() + " -- " );
return new SecurityExpressionRoot(authentication) {};
}
}
@Configuration
@EnableJpaRepositories
public class SecurityConfiguration {
@Bean
EvaluationContextExtension securityExtension() {
return new SecurityEvaluationContextExtension();
}
}
我使用的这个服务器有一个Spring资源服务器,因此使用下面的翻译从授权服务器获取Id。我确认代码执行和翻译都很好,但我得到了上面的异常。
@Service
public class myPrincipalExtractor implements PrincipalExtractor {
@Override
public UserInfo extractPrincipal(Map<String, Object> map) {
Map<String,Object> principal = null;
if (map.containsKey("principal")) {
principal = (Map<String, Object>) map.get("principal");
}
UserInfo user = new UserInfo();
if (principal != null ) {
if (principal.containsKey("id")) {
user.setId(Long.parseLong(principal.get("id").toString()));
}
if (principal.containsKey("username")) {
user.setUsername(principal.get("username").toString());
}
if (principal.containsKey("email")) {
user.setEmail(principal.get("email").toString());
}
}
System.out.println("----> " + user.getUsername() + " -> " + user.getId());
return user;
}
}
问题是。。。
@CrossOrigin
public interface StoreRepository extends CrudRepository<Store, Long>
{
@Query("select p , p.store, p.category from Product p JOIN p.store s " +
" JOIN p.category c " +
" WHERE p.store.id = :id AND p.keywords LIKE %:keyword% AND p.store.ownerId = ?#{principal.id} ")
List<Product> findByKeywordIgnoreCase(@Param("id") Long id , @Param("keyword") String keyword);
}
更多信息:
我在SecurityExpressionRoot中编写了下面的代码,所以现在我知道,当我在对象中放置SpEL、ID和用户名时,会调用它。还尝试将返回的对象强制转换为Principal,同样的问题也发生了。
p.store.owner我 = ? #{ principal.id}
return new SecurityExpressionRoot(authentication) {
@Override
public UserInfo getPrincipal() {
System.out.println("Fetching the principal has user " + authentication.getPrincipal().toString());
return (UserInfo) authentication.getPrincipal();
}
};
在网站示例中(https://spring.io/blog/2014/07/15/spel-support-in-spring-data-jpa-query-definitions)他们指定你可以使用#{principal.id}执行上面的代码时确实会调用它,但由于某种原因,@Query绑定会失败。但是我试着用另一个例子来运行它
@Query("select p , p.store, p.category from Product p JOIN p.store s " +
" JOIN p.category c " +
" WHERE p.store.id = :id AND p.keywords LIKE %:keyword% AND p.store.ownerId = ?#{#security.principal.id} ")
这起作用了。我在这里发现了另一个例子:https://github.com/spring-projects/spring-data-examples/blob/master/jpa/security/src/main/java/example/springdata/jpa/security/SecureBusinessObjectRepository.java
我正在编写一些代码,以允许使用Spring表达式语言进行动态属性更改。我传入一个bean名称、属性名称和新值的表达式,所有字符串。 这对于类型string、int、boolean和list的属性非常有效。我无法让地图属性工作。我已经看了SPeL留档,包括示例,但我没有看到我所做的任何错误。我得到的例外是没有帮助的。 忽略try/ak块,基本代码如下: 当我的“表达式”是“789,0123,345”
本文向大家介绍Spring Cloud @RefreshScope 原理及使用,包括了Spring Cloud @RefreshScope 原理及使用的使用技巧和注意事项,需要的朋友参考一下 @RefreshScope那些事 要说清楚RefreshScope,先要了解Scope Scope(org.springframework.beans.factory.config.Scope)是Spring
我使用的spring评估语言如下: 我的问题是bigMap中包含的大多数数据都没有被使用。相反,我更愿意通过将函数传递到求值上下文来延迟加载所需的内容,例如: 但我找不到如何做到这一点。有什么建议吗?
我一直在尝试Spring。我希望通过使用SPEL为另一个bean复制一个bean的值和引用属性。 考虑这个bean: 我希望将其值复制到另一个bean,如下所示:
本文向大家介绍Java中的代理原理及代理使用示例,包括了Java中的代理原理及代理使用示例的使用技巧和注意事项,需要的朋友参考一下 今天再测试Socket编程时,无法连接外网。公司用的是Http的代理。上网搜索也没看太懂,所以花了大量时间来学习。看了HTTP和TCP协议的关系好,才有所明白。现在能通过Socket使用HTTP代理了,结果很简单,过程却好难。 1. 先简要说说HTTP和TCP(具体内
我有三个单独的消息有效负载: 我想使用Spring Cloud Stream aggregator app starter处理器将这三个消息有效负载合并为一个: 通过使用聚合处理器的聚合器。聚合选项。文档指出,此属性的有效值是聚合策略的SpEL表达式,默认情况下,它会生成有效负载的集合。聚合器处理器的一个集成测试使用以下表达式: 从单独的有效载荷“foo”和“bar”生成聚合消息“foo”。虽然测