GVKun编程网logo

c# – Tridion 2009 – 使用Interops – 是否有可能为同一个Name添加多个setConditions

20

针对c#–Tridion2009–使用Interops–是否有可能为同一个Name添加多个setConditions这个问题,本篇文章进行了详细的解答,同时本文还将给你拓展006-SpringBoot

针对c# – Tridion 2009 – 使用Interops – 是否有可能为同一个Name添加多个setConditions这个问题,本篇文章进行了详细的解答,同时本文还将给你拓展006-Spring Boot自动配置-Condition、Conditional、Spring提供的Conditional自动配置、@ConditionalOnProperty 来控制 Configuration 是否生效、@ConditionalOnProperty来控制Configuration是否生效、android – Edittext imeOptions actionDone不使用digits属性?等相关知识,希望可以帮助到你。

本文目录一览:

c# – Tridion 2009 – 使用Interops – 是否有可能为同一个Name添加多个setConditions

c# – Tridion 2009 – 使用Interops – 是否有可能为同一个Name添加多个setConditions

我遇到了小问题.

我想为PublicationTarget的相同Name添加多个setConditions.这是使用interops dll.

ListRowFilter rowFilter = mTDSE.CreateListRowFilter();
rowFilter.SetCondition("StartDate",sDate);
rowFilter.SetCondition("EndDate",eDate);
rowFilter.SetCondition("PublicationTarget",pubStgTarget);

对于这个PublicationTarget,我想要使用staging&活的目标,我尝试了所有的方式,但没有用.

rowFilter.SetCondition("PublicationTarget",pubStgTarget);

请建议,
1.通过xis可能,最好的方法是什么?

我尝试过这种方式,但没有运气; –

rowFilter.SetCondition("PublicationTarget","tcm:0-1-65537"); // Gives only staging
rowFilter.SetCondition("PublicationTarget","tcm:0-2-65537"); // Gives only Live
rowFilter.SetCondition("PublicationTarget","tcm:0-1-65537|tcm:0-1-65537"); // No result
rowFilter.SetCondition("PublicationTarget",oPubList); // No result - `oPubList` is a

列表与LT;串GT;

解决方法

不,不幸的是,这是不可能的.如果要在PublicationTarget上添加条件,则必须只有一个PublicationTarget.

但是有2种解决方法:

>创建两个RowFilter并在每个RowFilters中设置不同的PublicationTarget条件.然后,您将发出两次查询(每个过滤器一次).这意味着您需要处理2个XML结果节点.
>执行GetListPublishTransactions()时不要使用PublicationTarget条件.然后,您将获得一个包含所有PublicationTargets记录的XML元素.在您的代码中,您只会过滤您感兴趣的内容(例如,分段或直播).

我可能会使用#2(除非我知道Publish Queue可能会返回大量的记录,在这种情况下,我会使用#1).

#2的示例代码:

tdse = new TDS.TDSEClass();
tdse.Impersonate(user.Title);
tdse.Initialize();

mgtInfo = tdse.GetManagementInfo();
filter = tdse.CreateListRowFilter();

filter.SetCondition("InfoType",2); // InProgress
filter.SetCondition("Publication","tcm:0-23-1");

XmlDocument dom = new XmlDocument();
dom.LoadXml(mgtInfo.GetListPublishTransactions(filter));

XmlNamespaceManager namespaceManager = new XmlNamespaceManager(new NaMetable());
namespaceManager.AddNamespace("tcm","http://www.tridion.com/ContentManager/5.0");

String xPath = String.Format(
    "tcm:ListPublishTransactions/tcm:Item[@PublicationTarget='{0}'] | " +
    "tcm:ListPublishTransactions/tcm:Item[@PublicationTarget='{1}']",stagingTcmUri,liveTcmUri);
XmlNodeList nodeList = dom.SelectNodes(xPath,namespaceManager);

foreach (XmlNode node in dom.DocumentElement.ChildNodes) {
    //do your thing
}

注意:仔细检查XPath表达式,我实际上没有测试过那个位.

006-Spring Boot自动配置-Condition、Conditional、Spring提供的Conditional自动配置

006-Spring Boot自动配置-Condition、Conditional、Spring提供的Conditional自动配置

一、接口Condition、Conditional(原理)

主要提供一下方法

boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);

true:表示装配

false:表示不装配

1.1、Conditional

  在Spring4中引入,其主要作用就是判断条件是否满足,从而决定是否初始化并向容器注册Bean

注解:Conditional() 参数是数组,数组内的都是true才装配

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {

    /**
     * All {@link Condition}s that must {@linkplain Condition#matches match}
     * in order for the component to be registered.
     */
    Class<? extends Condition>[] value();

}
View Code

通常配合使用。

示例:

接口:EncodingConvert

package com.lhx.spring.springboot_auto_config;

public interface EncodingConvert {

}
View Code

接口实现一:UTF8EncodingConvert 

package com.lhx.spring.springboot_auto_config;

public class UTF8EncodingConvert implements EncodingConvert {

}
View Code

接口实现二:GBKEncodingConvert

package com.lhx.spring.springboot_auto_config;

public class GBKEncodingConvert implements EncodingConvert {

}
View Code

配置类:

package com.lhx.spring.springboot_auto_config;

import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;

@SpringBootConfiguration
public class EncodingConvertConfiguration {
    @Bean
    public EncodingConvert createGBKEncodingConvert() {
        return new GBKEncodingConvert();
    }

    @Bean
    public EncodingConvert createUTF8EncodingConvert() {
        return new UTF8EncodingConvert();
    }
}
View Code

App:

package com.lhx.spring.springboot_auto_config;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.Conditional;

@SpringBootApplication
public class App {
    @Bean
    public Runnable createRunnable() {
        return () -> {
            System.out.println("spring boot is running");
        };
    }

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
        context.getBean(Runnable.class).run();
        //可以通过启动参数修改-Dfile.encoding=GBK
        System.out.println(System.getProperty("file.encoding"));
        System.out.println(context.getBeansOfType(EncodingConvert.class));
        context.close();
    }
}
View Code

此时,会发现连个接口实现都会被装配进来。

UTF8Condition实现Condition接口

package com.lhx.spring.springboot_auto_config;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class UTF8Condition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String encoding = System.getProperty("file.encoding");
        if (encoding != null) {
            return "utf-8".equalsIgnoreCase(encoding);
        }
        return false;
    }

}
View Code

GBKCondition实现Condition接口

package com.lhx.spring.springboot_auto_config;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class GBKCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String encoding = System.getProperty("file.encoding");
        if (encoding != null) {
            return "gbk".equalsIgnoreCase(encoding);
        }
        return false;
    }

}
View Code

修改配置类

package com.lhx.spring.springboot_auto_config;

import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;

@SpringBootConfiguration
public class EncodingConvertConfiguration {
    @Bean
    @Conditional(GBKCondition.class)
    public EncodingConvert createGBKEncodingConvert() {
        return new GBKEncodingConvert();
    }

    @Bean
    @Conditional(UTF8Condition.class)
    public EncodingConvert createUTF8EncodingConvert() {
        return new UTF8EncodingConvert();
    }
}
View Code

此时,会发现会根据file.encoding值来装配接口类。

可在启动参数增加

  -Dfile.encoding=GBK  

  

然后调试,发现装配类也变了

注意:@Conditional也可以作用在类上

 二、Spring提供的Conditional自动配置

jar:spring-boot-autoconfigure中,org.springframework.boot.autoconfigure.condition;即spring-boot提供

ConditionalOnBean:当存在某个bean时候装配

ConditionalOnMissingBean:当不存在某个bean时候装配注解的bean

ConditionalOnClass:当classpath有才装配

ConditionalOnExpression:

ConditionalOnJava:JDK版本符合时候才装配

ConditionalOnNotWebApplication:不是web环境才装配

ConditionalOnWebApplication:是web环境才装配

ConditionalOnResource:资源存在才装配

ConditionalOnProperty:配置存在才装配

2.1、ConditionalOnProperty 配置存在匹配时候才配置

增加配置类

package com.lhx.spring.springboot_auto_config;

import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;

@SpringBootConfiguration
public class UserConfiguration {

    @Bean
    @ConditionalOnProperty(name = "runnable.enable", havingValue = "true")
    public Runnable createRunnable() {
        return () -> {
        };
    }

}
View Code

App2编写

package com.lhx.spring.springboot_auto_config;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.Conditional;

@SpringBootApplication
public class App2 {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(App2.class, args);
        System.out.println(context.getBeansOfType(Runnable.class));
        context.close();
    }
}
View Code

默认是不能装配的

可以再application.properties中添加runnable.enable=true即可装配

或者@ConditionalOnProperty(name = "runnable.enable", havingValue = "true")增加

matchIfMissing=true,表示配置没有的时候也生效

2.2、ConditionalOnClass classpath 有某个类才装配

增加或删除maven,查看效果

<dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.2</version>
        </dependency>

使用代码

    @Bean
    @ConditionalOnClass(name="com.google.gson.Gson")
    public Runnable createGsonRunnable() {
        return () -> {
        };
    }

2.3、ConditionalOnBean:根据容器中是否存在某个Bean进行装配

    @Bean
    @ConditionalOnBean(name="user")
    public Runnable createOnBeanRunnable() {
        return () -> {
        };
    }

示例一、根据配置选择不同的实现类注入

需求:根据配置选择不同的实现类注入,有个业务逻辑,有两套模式,大部分功能流程一致,但涉及某些实现不一致,标准的模板模式:004-行为型-02-模板方法模式(Template Method)

 实际使用中会有,默认是一种实现,如果有某个配置,则生效。可以参看springboot自动装配实现,如Cache等

实现:https://github.com/bjlhx15/common.git   spring-framework-core/spring-aop/testconditional

基础业务接口

public interface ITestConditionalService {
    String getBefore();
    String get();
}

 

如果新增业务需要新增配置

public class ConstBean {
    public final static String atest="atest";
    public final static String btest="btest";
}

 

抽象类实现公共方案步骤

public abstract class AbstractTestConditionalService implements ITestConditionalService {

    @Override
    public abstract String getBefore();

    @Override
    public String get() {
        String before = this.getBefore();
        // do something
        return "before:" + before;
    }
}

 

第一种实现方案:也就是默认方案

@Service("aTestConditionalServiceImpl")
@ConditionalOnProperty(name = "set.test",havingValue = ConstBean.atest,matchIfMissing = true)
public class ATestConditionalServiceImpl extends AbstractTestConditionalService {
    @Override
    public String getBefore() {
        return "atest test";
    }
}

 

第二种方案

@Service("bTestConditionalServiceImpl")
@ConditionalOnProperty(name = "set.test",havingValue = ConstBean.btest)
public class BTestConditionalServiceImpl extends AbstractTestConditionalService {
    @Override
    public String getBefore() {
        return "btest test";
    }
}

 

配置 如果是a逻辑可默认不写

# 配置实现 atest、btest
set.test=atest

 

@ConditionalOnProperty 来控制 Configuration 是否生效

@ConditionalOnProperty 来控制 Configuration 是否生效

1. 简介

Spring Boot 通过 @ConditionalOnProperty 来控制 Configuration 是否生效

2. 说明

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty {

    String[] value() default {}; //数组,获取对应property名称的值,与name不可同时使用  
  
    String prefix() default "";//property名称的前缀,可有可无  
  
    String[] name() default {};//数组,property完整名称或部分名称(可与prefix组合使用,组成完整的property名称),与value不可同时使用  
  
    String havingValue() default "";//可与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置  
  
    boolean matchIfMissing() default false;//缺少该property时是否可以加载。如果为true,没有该property也会正常加载;反之报错  
  
    boolean relaxedNames() default true;//是否可以松散匹配  
}

3. 使用方法

通过其两个属性 name 以及 havingValue 来实现的,其中 name 用来从 application.properties 中读取某个属性值。
如果该值为空,则返回 false;
如果值不为空,则将该值与 havingValue 指定的值进行比较,如果一样则返回 true; 否则返回 false。
如果返回值为 false,则该 configuration 不生效;为 true 则生效。

4. 使用示例

我们来模拟通过 application.yml 配置文件来配置我们的服务是使用 Nosql 型的数据库还是 sql 数据库

application.yml 的配置如下:

database:
  type: "${DATABASE_TYPE:cassandra}" # cassandra OR sql

这里我们分别定义 Nosql 的注解与 sql 的注解

@ConditionalOnProperty(prefix = "database", value = "type", havingValue = "cassandra")
public @interface NoSqlDao {
}

@ConditionalOnProperty(prefix = "database", value = "type", havingValue = "sql")
public @interface SqlDao {
}

然后简单的写一下 dao 的实现:

public interface DeviceDao {
    List<Device> findDevicesByCustomerId(UUID customerId);
}

@Component
@SqlDao
public class JpaDeviceDao implements DeviceDao {
    @Override
    public List<Device> findDevicesByCustomerId(UUID customerId) {
        return null;
    }
}

@Component
@NoSqlDao
public class CassandraDeviceDao implements DeviceDao {

    @Override
    public List<Device> findDevicesByCustomerId(UUID customerId) {
        return null;
    }
}

那么当我们想使用 cassandra 数据库的时候,只需要更改 yml 配置文件为 cassandra。

而在 DeviceServiceImpl 中,代码则不需要进行更改,因为此时 @ConditionalOnProperty 注解让我们的 JpaDeviceDao 的注入失效了,所以会自动匹配 CassandraDao

@Autowired
private DeviceDao deviceDao;

 

参考链接:https://www.jianshu.com/p/7bfe623cabcf

@ConditionalOnProperty来控制Configuration是否生效

@ConditionalOnProperty来控制Configuration是否生效

1. 简介

Spring Boot通过**@ConditionalOnProperty来控制Configuration**是否生效

2. 说明

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty {

    String[] value() default {}; //数组,获取对应property名称的值,与name不可同时使用  
  
    String prefix() default "";//property名称的前缀,可有可无  
  
    String[] name() default {};//数组,property完整名称或部分名称(可与prefix组合使用,组成完整的property名称),与value不可同时使用  
  
    String havingValue() default "";//可与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置  
  
    boolean matchIfMissing() default false;//缺少该property时是否可以加载。如果为true,没有该property也会正常加载;反之报错  
  
    boolean relaxedNames() default true;//是否可以松散匹配,至今不知道怎么使用的  
} 
}


3. 使用方法

通过其两个属性name以及havingValue来实现的,其中name用来从application.properties中读取某个属性值。
如果该值为空,则返回false;
如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。
如果返回值为false,则该configuration不生效;为true则生效。

4. code

@Configuration
//在application.properties配置"mf.assert",对应的值为true
@ConditionalOnProperty(prefix="mf",name = "assert", havingValue = "true")
public class AssertConfig {
    @Autowired
    private HelloServiceProperties helloServiceProperties;
    @Bean
    public HelloService helloService(){
        HelloService helloService = new HelloService();
        helloService.setMsg(helloServiceProperties.getMsg());
        return helloService;
    }
}

5. 收获

springboot注解丰富,我们可以利用好这些注解来实现我们自定义的starter配置,减少硬编码的校验,降低组件间的耦合性!!!

android – Edittext imeOptions actionDone不使用digits属性?

android – Edittext imeOptions actionDone不使用digits属性?

我有一个Editext.它包含属性数字和imeOptions(actionDone).
<android.support.v7.widget.AppCompatEditText
        android:id="@+id/edit_text_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:digits="1234567890abcdefghijklmnopqrstuvwxyz....."
        android:hint="@string/item_name"
        android:imeOptions="actionDone"
        android:maxLines="1" />

使用数字&&amp ;;时找不到actionDone(Softkeyword中的Done按钮) imeOptions属性在一起.我们只能找到不会改变焦点的输入按钮.我通过跳过digit属性尝试了它,然后imeOptions正常工作.
提前致谢

解决方法

只需将singleLine =“true”添加到您的edittext即可
android:singleLine = "true"

关于c# – Tridion 2009 – 使用Interops – 是否有可能为同一个Name添加多个setConditions的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于006-Spring Boot自动配置-Condition、Conditional、Spring提供的Conditional自动配置、@ConditionalOnProperty 来控制 Configuration 是否生效、@ConditionalOnProperty来控制Configuration是否生效、android – Edittext imeOptions actionDone不使用digits属性?等相关知识的信息别忘了在本站进行查找喔。

本文标签: