Tag: spring el

用于Spring安全性的SpEL:将值从XML传递到基于Java的SpEL配置

我想将xml文件中指定的属性值传递给Java中的Spring表达式(SpEL)。 你能指出我如何实现这一目标吗? 为清楚起见,我提供了以下示例。 example.xml文件: 请记住,我有’用户’和’客户’模型类。 我希望通过以下方式使用预授权注释和Spring表达式来保护名为“edit”的方法。 @PreAuthorize(“(#user.userId == #customer.customerId)”) public Boolean edit(User user, Customer custmer) { return true; } 问题是,如何将userId和customerId的值从“example.xml文件传递到上面的表达式来比较这两个值,然后保护’edit’方法? 注意:我不想使用权限评估程序。 如果可以在不考虑许可评估者的情况下进行,请指出我。 非常感谢您的支持与合作!

修改本机查询不能有命名参数绑定?

我在JpaRepository中指定了以下修改本机查询。 public interface PlayerStatisticsRepository extends JpaRepository { @Modifying @Query(value = “INSERT INTO playerstatistics(enteredTheFieldAtInSeconds, leftTheFieldAtInSeconds, hometeam_name, matchday_matchdaynumber, playedFromTheFirstWhistleblow, player_id) VALUES (:enteredTheFieldAtInSeconds, :leftTheFieldAtInSeconds, :#{#match.primaryKey.homeTeam.name}, :#{#match.primaryKey.matchday.matchdayNumber}, :playedFromTheFirstWhistleblow, :#{#player.id})”, nativeQuery = true) void insertIntoPlayerStatistics(int enteredTheFieldAtInSeconds, int leftTheFieldAtInSeconds, boolean playedFromTheFirstWhistleblow, Match match, Player player); } 不幸的是,它以运行时的exception结束,说可能是match参数的绑定不存在,而它显然是。 org.springframework.dao.InvalidDataAccessApiUsageException: No parameter binding found for name match!; nested exception is java.lang.IllegalArgumentException: No parameter […]

将$ {my.property}评估为@Value注释中的SpEL表达式

长话短说: 有没有办法在不使用转换器的情况下将${my.property}产生的字符串解释为@Value注释中的SpEL表达式,例如@Value(“#{${my.property}} ? 我有一个抽象工厂(简化),它允许我构建一些常见的对象,这些对象是我系统配置的一部分。 @Component public class Factory { public Product makeVal(int x) { return new Product(5); } } 为了更灵活,我想让用户在app.properties文件中编写SpEL表达式,以便可以直接访问工厂: my.property = @Factory.makeVal(12) 现在,在需要此属性的类中,为了实现我的目标,我编写了以下代码。 @Value(“#{${my.property}}”) private Product obj; 我认为${my.property}将被宏扩展,然后由#{}作为相应的SpEL表达式进行评估,在上面的示例中为@Factory.makeVal(12) 。 不幸的是,情况并非如此,加载Spring上下文导致错误,说它无法将字符串(属性值${my.property} )转换为目标类型Product 。 现在,我通过编写一个实现Converter的类来解决这个问题,但是它非常复杂,因为我需要通过实例化ExpressionParser等以编程方式将字符串计算为SpEL表达式。 但是有更简单的解决方案吗? 是否有一个SpEL表达式放在@Value注释中,这样我只需将${my.property}作为SpEL表达式进行评估,好吗?

评估Spring Expression Lang(SpEL)中的属性

我们的服务有一个根据属性文件安排的进程,读取属性refreshIntervalMillis 。 它的值直接在Quartz触发器中注入,具有以下配置: … 但是,安装此服务的管理员会考虑小时/天,因此为了使事情变得更容易,我们将其更改为: 将refreshIntervalMillis重命名为refreshIntervalMinutes 更改为上面的代码到以下内容: p:repeatInterval =“#{1000 * 60 * T(java.lang.Integer).valueOf(@configurationProperties [‘garbageLevelWatcher.refreshIntervalMinutes’])}” 注意:属性对象公开为名为“configurationProperties”的bean 是否有更简单的语法来实现相同的目标? 谢谢,

Spring Integration FTP – 使用远程目录表达式创建动态目录(Java配置)

使用Spring Integration的SFTP会话工厂(使用Java配置)时,我想动态设置远程SFTP服务器目录。 Spring文档说这是可能的: Spring Integration SFTP适配器 SpEL和SFTP出站适配器 与Spring Integration中的许多其他组件一样,通过指定两个属性remote-directory-expression和remote-filename-generator-expression ,您可以在配置SFTP出站通道适配器时受益于Spring Expression Language(SpEL)支持(参见上文) 。 表达式评估上下文将使用Message作为其根对象,从而允许您提供可以根据Message中的数据(来自有效负载或标头 )动态计算文件名或现有目录路径的表达式。 在上面的示例中,我们使用表达式值定义remote-filename-generator-expression属性,该表达式值根据其原始名称计算文件名 ,同时还附加后缀: – foo 。 但我实施这个问题很麻烦。 我似乎无法找到一个使用Spring的SpEL表达式语言的好例子。 下面的代码可以工作,并将我的文件发送到下面的根目录,或者如果我在LiteralExpression中输入一个特定的目录。 但我想将LiteralExpression表达式替换为使用“path”标题的SpelExpression,类似于我对“file”标题所做的操作,它动态调整正在上传的文件名。 @Configuration public class SftpConfig { @Autowired private SftpSettings sftpSettings; @Bean public SessionFactory sftpSessionFactory() { DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true); factory.setHost(sftpSettings.getHostname()); factory.setPort(sftpSettings.getPort()); factory.setUser(sftpSettings.getUsername()); factory.setPassword(sftpSettings.getPassword()); factory.setAllowUnknownKeys(true); return new CachingSessionFactory(factory); } @Bean @ServiceActivator(inputChannel = […]

String.replace()返回不需要的字符串

我正在处理一段代码,我要将字符串拆分成单个部分并替换它们。 我的代码的基本逻辑流程是,有一个包含公式的字符串。 LHS下面的数字,即1,2和3是不同对象的ID。 一旦我拆分它们,我就会使用这些ID,获取相应的值并将下面String中的ID替换为其各自的值。 我的字符串如下 – String str = “(1+2+3)>100”; 我用以下代码分割字符串 – String[] arraySplit = str.split(“\\>|\\<|\\="); String[] finalArray = arraySplit[0].split("\\(|\\)|\\+|\\-|\\*"); arraySplit[0] = arraySplit[0].replace(id,reading); 因此,在分割字符串之后,我将用值替换字符串,即字符串现在是, (30+45+50)>100 ,其中30,45和50是相应的值。 (然后在SpEL中使用此字符串来评估公式) 在用值替换字符串时,我得到以下响应 – 初始字符串 – (1+2+3)>100其中1,2和3是id。 ID的各自值分别为30.0,45.0和50.0。 使用for循环替换值后,字符串是 – (50.00.0+45.0+50.0)>100 。 第一个值很奇怪。 原因是在第三次迭代中,字符串看起来像这样 – (30.0 + 45.0 + 3)> 100。 因此,在第三次迭代中替换字符串时,它将所有3的实例替换为50.0,从而产生上述字符串。 所以显然使用String.replace()在这里不是更好的选择。 那么在这种情况下我应该使用什么方法呢? 我也在使用SpEL,所以如果使用SpEL有更好的解决方案,那么它也很好。 这里, (1+2+3)>100只是一个例子。 圆括号是公式的一部分,字符串也可以是((1+2+3)*(5-2))>100 。 或者甚至可以改变公式的语法,目前公式是这样的 […]

Spring 3.1缓存 – 如何在SpEL中使用返回值

我试图在Spring管理的缓存(Spring 3.1抽象)中驱逐一个条目。 我需要在注释中的“key”属性的SpEL中引用方法的返回值: /* (How to refer to the ‘T’ returned value in the “KEY_ID”?) */ @Caching(evict = { @CacheEvict(value = CACHE_BY_ID, key = KEY_ID) }) public T delete(AppID appID, UserID userID) throws UserNotFoundException { return inner.delete(appID, userID); } 有没有办法做到这一点?

自定义注释中的Spring表达式语言

我想在自定义注释中使用Spring Expression Language。 此注释将由自定义Aspect使用。 看一下这个: @StatisticEventTrigger(value = TestStatisticEvent.class, expression = “#p1”) public void someOtherMethod(String arg1, Long arg2) { 如您所见,我想使用表达式(在本例中)来检索一些特定的参数。 当我有我的Aspect,触发带注释的方法时,我想评估spring表达式(以编程方式)来检索用于进一步业务的值;) 有任何想法吗? 到目前为止谷歌不是我的朋友!

如何在bean存在时注入它

我有弹簧上下文文件的以下结构( ->代表’includes’): A1.xml -> B.xml & C.xml A2.xml -> B.xml C.xml定义了一个bean c B.xml定义了一个依赖于c的bean b 显然这对于​​A2来说是失败的,因为在上下文A2没有定义c 。 如何指定类似的东西:如果你在上下文中有c ,请将其注入b否则只注入null ? 我看了一下Spring EL但是 刚给了我一个名字的NoSuchBeanDefinitionException ,它似乎是b.toString()的值! 顺便说一句:我已经知道这件东西太乱了,应该尽快清理干净。

Spring @Value TypeMismatchException:无法将类型’java.lang.String’的值转换为必需类型’java.lang.Double’

我想使用@Value注释来注入Double属性,例如: @Service public class MyService { @Value(“${item.priceFactor}”) private Double priceFactor = 0.1; // … 并使用Spring属性占位符(属性文件): item.priceFactor=0.1 我得到例外: org.springframework.beans.TypeMismatchException:无法将类型’java.lang.String’的值转换为必需类型’java.lang.Double’; 嵌套exception是java.lang.NumberFormatException:对于输入字符串:“$ {item.priceFactor}” 有没有办法使用来自属性文件的Double值?