小编Sin*_*hot的帖子

Spring 3:注入默认Bean,除非存在另一个Bean

我想通过XML配置Spring,这样如果存在特定的bean,它将被注入目标bean.如果它不存在,将注入一个不同的默认bean.

例如,如果我有这样的文件

<bean id="carDriver" class="Driver">
  <property name="car" value="SOME EXPRESSION GOES HERE, SEE ATTEMPT BELOW"/>
</bean>

<bead id="defaultCar" class="Car">
  <property name="name" value="Honda Accord"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

加载它,我想defaultCar注入驱动程序.但是,如果我还加载以下文件:

<bean id="customCar" class="FlyingCar">
  <property name="name" value="Rocket Car"/>
  <property name="maxAltitude" value="80000"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

我希望使用customCarbean而不是defaultCarbean.我最初的尝试不起作用,但我认为说明了我想要实现的目标:

<bean id="carDriver" class="Driver">
  <property name="car" value="#{ @customCar eq null ? 'defaultCar' : 'customCar' }"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

我知道如何使用a PropertyPlaceholderConfigurer,但除了包含自定义bean的文件之外,我不想提供属性文件/ VM属性/环境变量/等.谢谢!


更新:

基于"使用工厂bean"评论,我调查了这个并提出了以下解决方案.首先,我创建了一个通用工厂bean,允许您指定默认的bean名称和覆盖bean名称:

public class DefaultOverrideFactoryBean implements FactoryBean, BeanFactoryAware {

    public Object getObject() throws Exception {
        return beanFactory.containsBean(overrideBeanName) ?
               beanFactory.getBean(overrideBeanName) …
Run Code Online (Sandbox Code Playgroud)

java xml spring spring-el

15
推荐指数
4
解决办法
2万
查看次数

如何使用Cucumber和Webrat检查表单是否预先填充了值?

我正在学习使用Rails的Cucumber和Webrat,并希望获得一些关于测试"编辑"表单的最佳方法的建议.当我浏览用户的个人资料时,我会看到一个编辑表单,其中用户的信息预先填写在表单字段中.我希望能够测试这些字段确实包含我期望的信息.这是我的情景:

  Scenario: View My Profile
    Given  I am logged in as "Mike" with password "secret"
    When I go to my profile page
    Then I should see "Mike" in the "Login" field
    And I should see "mike@email.com" in the "Email" field
    And I should see a blank "Password" field
    And I should see a blank "Password confirmation" field
Run Code Online (Sandbox Code Playgroud)

黄瓜告诉我,我需要定义以下自定义步骤:

Then /^I should see "([^\"]*)" in the "([^\"]*)" field$/ do |arg1, arg2|
  pending
end

Then /^I should see a blank "([^\"]*)" field$/ …
Run Code Online (Sandbox Code Playgroud)

regex bdd ruby-on-rails webrat cucumber

10
推荐指数
1
解决办法
2456
查看次数

RESTful JSF可能吗?

我最近坐下来将一个简单的Rails应用程序移植到JSF(使用Seam)以获得我将更高效的感觉.Rails应用程序是RESTful,我喜欢.在开始使用JSF时,我很惊讶地发现,或许是错误的,JSF只支持POST,这使得它本身就不是RESTful.

我搜索了一下但找不到满意的答案.JSF/Seam似乎非常受欢迎,但对我来说它禁止所有HTTP方法而不是POST是没有意义的.是不是JSF本身不允许RESTful架构,或者我错了,RESTful JSF是可能的(本身或通过插件)?

rest jsf seam

9
推荐指数
2
解决办法
2万
查看次数

使用Logback屏蔽密码?

我们目前通常会记录进出系统的所有XML文档,其中一些文档包含明确的密码.我们希望能够配置执行此操作的logback logger/appender来执行某些模式匹配或类似操作,如果它检测到存在替换它的密码(最有可能使用星号).注意我们不想过滤掉日志条目,我们想要屏蔽它的一部分.我很感激有关如何使用logback完成此操作的建议.谢谢.

java passwords logging logback masking

7
推荐指数
1
解决办法
9258
查看次数

JAXB编组和多态

我有一个JAXB生成的类的层次结构.我想将子类编组为基类元素(但具有所有子类属性),使用xsi:type来指示具体类型.

例如,给定Animal和Bird子类:

<xs:complexType name="animal" abstract="true">
    <xs:sequence>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="bird">
    <xs:complexContent>
        <xs:extension base="animal">
            <xs:sequence>
                <xs:element name="maxAltitude" type="xs:int"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:element name="Animal" type="animal"/>
<xs:element name="Bird" type="bird"/>
Run Code Online (Sandbox Code Playgroud)

不管我如何编组一只鸟,例如:

Bird sparrow = new Bird();
sparrow.setName("Sparrow");
sparrow.setMaxAltitude(1000);

JAXBContext context = JAXBContext.newInstance(Animal.class, Bird.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(sparrow, System.out);
Run Code Online (Sandbox Code Playgroud)

结果始终是Bird元素:

<Bird xmlns="http://mycompany.com/animals">
    <name>Sparrow</name>
    <maxAltitude>1000</maxAltitude>
</Bird>
Run Code Online (Sandbox Code Playgroud)

但是我想要的是这个(子类的所有属性,xsi类型,基类元素名称):

<Animal xmlns="http://mycompany.com/animals"
        xsi:type="bird"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <name>Sparrow</name>
    <maxAltitude>1000</maxAltitude>
</Animal>
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果我创建一个包装元素:

<xs:complexType name="animalWrapper">
    <xs:sequence>
        <xs:element name="Animal" type="animal"/>
    </xs:sequence>
</xs:complexType>

<xs:element name="AnimalWrapper" type="animalWrapper"/>
Run Code Online (Sandbox Code Playgroud)

并编组它,它使用基类类型:

<AnimalWrapper xmlns="http://mycompany.com/animals" …
Run Code Online (Sandbox Code Playgroud)

java polymorphism xsd jaxb

6
推荐指数
1
解决办法
4082
查看次数

您如何表示RESTful资源的“瘦”和“胖”版本?

您将如何对可以具有两种不同表示形式的资源进行建模。例如,一个表示可能很“瘦”,其大部分相关资源都可以通过链接访问。另一种表示形式可能是“胖”,其中嵌入了大多数相关资源。这个想法是,有些客户不介意打很多电话来浏览链接的资源,而另一些客户则想一次获取所有数据。

考虑与导演,演员等相关的电影资源。也许它的精简版仅具有电影标题,并且要获取导演,演员列表等的数据,必须通过发出其他请求。嵌入到它们的链接。也许胖版本包含了嵌套在里面的所有电影,包括导演的数据,各个演员的数据等。

一个应该如何建模?

我看到一些选择:

  1. 这两种表示形式实际上是两种不同的资源,并且需要不同的URI。
  2. 这两种表示形式实际上是相同的资源,您可以通过自定义媒体类型在两种表示形式之间进行选择,例如application/vnd.movie.thin+jsonapplication/vnd.movie.fat+json
  3. 这两种表示实际上是相同的资源,选择不同的表示应使用查询参数(例如 /movies/1?view=thin)。
  4. 还有别的...

您如何看待这种API的正确方法?

rest hateoas hypermedia

5
推荐指数
2
解决办法
805
查看次数

Spring Data JPA:使用规范实现自定义存储库行为

我想创建一个具有自定义行为的Spring Data JPA存储库,并使用Specification实现该自定义行为.我已经通过Spring Data JPA文档在单个存储库中实现自定义行为来设置它,除了没有在自定义存储库中使用Spring Data Specification的示例.如果可能的话,如何做到这一点?

我没有看到一种方法将某些内容注入到需要规范的自定义实现中.我认为我会很棘手,并将存储库的CRUD存储库部分注入自定义部分,但这会导致循环实例化依赖.

我没有使用QueryDSL.谢谢.

java spring jpa spring-data spring-data-jpa

5
推荐指数
1
解决办法
1705
查看次数

用黄瓜测试分页特征

我正在学习和喜欢黄瓜,现在有一个功能我不确定通过BDD继续进行的最佳方式:分页.我有一些场景(在我看来),其中有零页面,一页,几页等,并且我想确定某些页面上的某些记录,确保"下一步"按钮不是链接时最后一页等

我将使用will_paginate,所以基本上我想弄清楚如何将BDD的功能用于特定的项目列表,例如书籍.

我相信我可以搞砸它,但我觉得这应该是常见的,并希望看到别人做了什么.任何人都可以推荐一篇文章,或者指出一些示例代码,甚至可以自己一个例子?

bdd pagination ruby-on-rails cucumber

3
推荐指数
1
解决办法
2593
查看次数

多个相同类型的杰克逊序列化器

我正在使用Jackson进行JSON序列化,并编写了一些自定义String序列化程序,一个用于类的每个getter方法.每个方法都返回相同的类型Set<String>,但每个方法使用不同的序列化程序.

不幸的是,杰克逊没有使用每个序列化器,每个方法一个,但是两个都使用一个序列化器.它似乎采用按字母顺序排列的任何方法,并将两种方法用于序列化程序.我期望的是第一种方法注释的序列化器用于第一种方法,第二种方法注释的序列化器用于第二种方法.调试似乎表明Jackson在地图中使用方法的返回类型键入了序列化程序(两者都相同).

一个例子:

public class FooBar {

  private Set<String> foos = new HashSet<String>();
  private Set<String> bars = new HashSet<String>();

  @JsonProperty("FooWrapper")
  @JsonSerialize(contentUsing = FooSerializer.class)
  public Set<String> getFoos() {
    return foos;
  }

  @JsonProperty("BarWrapper")
  @JsonSerialize(contentUsing = BarSerializer.class)
  public Set<String> getBars() {
    return bars;
  }
}
Run Code Online (Sandbox Code Playgroud)

有关如何getFoos()使用a 获取方法序列化的任何建议FooSerializer,以及getBars()使用BarSerializer?序列化的方法?在此示例中,BarSerializer将为两个方法调用.

请注意,如果我将其中一个方法的签名更改为另一个集合类型,以便它们不同 - List<String>例如 - 序列化可以工作.

提前致谢.

java json jackson

3
推荐指数
1
解决办法
3049
查看次数

使用 Spring Data R2DBC 查找/修改/保存或更新插入

我正在尝试了解反应式编程,特别是 Spring 和 Spring Data R2DBC。可以帮助我更好地理解它的一件事是对对象进行查找/修改/保存或“更新插入”。传统的交互可能如下所示:

Book save(Book book) {

   Book existing = repository.findByIsbn(book.getIsbn())

   if (existing != null) {
     return repository.save(found.copyMutableValuesFrom(book));
   }

   return repository.save(book);
}
Run Code Online (Sandbox Code Playgroud)

对于 Monos 来说这看起来怎么样?我知道如何进行直接查找或直接保存,但更复杂的查找/更新/保存或更新插入却让我困惑。

谢谢。

java project-reactor spring-data-r2dbc r2dbc

2
推荐指数
1
解决办法
8171
查看次数