весенняя автопроводка с уникальными бобами: весна ожидала одного соответствующего боба, но найдена

Ниже приведено минимальное воспроизведение:

pub struct Canvas;

impl Canvas {
    fn color(&self) -> &Canvas { self }
}

fn main() {
    let mut canvas = Canvas.color();
    //             1 ^~~~~~
    //                    2 ^~~~~
}

Проблема возникает из-за того, что вы создаете временную переменную (1), а затем передаете ссылку на эту переменную методу (2), который возвращает ссылку. В конце цепочки методов вы пытаетесь вернуть ссылку и сохранить ее в переменной, но ссылка указывает на временный элемент, который негде жить ! Rust не позволяет ссылаться на что-то недопустимое.

Часть проблемы состоит в том, что этот не является шаблоном Builder , это просто структура, которая модифицирует себя, используя вызов цепочки методов . Некоторые решения:

  1. Хранить «временную» переменную, и в этом случае все методы являются только обычными методами мутации, которые происходят после этого.
  2. Возьмите self вместо ссылаться на self (&self, &mut self), а затем в конечном итоге возвращать полную структуру.
  3. Использовать метод build в конце цепочки, который возвращает другую автономную структуру, а не ссылку.
41
задан Rob McFeely 7 December 2011 в 11:41
поделиться

3 ответа

Если я не ошибаюсь, имя bean-компонента по умолчанию, объявленное с помощью @Component, - это имя его класса, первая буква которого в нижнем регистре. Это означает, что

@Component
public class SuggestionService {

объявляет bean-компонент типа SuggestionService и имени suggestionService. Это эквивалентно

@Component("suggestionService")
public class SuggestionService {

или

<bean id="suggestionService" .../>

Вы переопределяете другой бин того же типа, но с другим именем, в XML:

<bean id="SuggestionService" class="com.hp.it.km.search.web.suggestion.SuggestionService">
    ...
</bean>

Таким образом, либо укажите имя компонента в аннотации как SuggestionService, либо используйте идентификатор suggestionService в XML (не забудьте также изменить элемент <ref> или удалить его, так как это не нужно). В этом случае определение XML переопределит определение аннотации.

6
ответ дан JB Nizet 7 December 2011 в 11:41
поделиться

Если у вас есть 2 бина одного и того же класса, автоматически подключенных к одному классу, вы должны использовать @Qualifier ( Пример Spring Autowiring @Qualifier ).

Но, похоже, ваша проблема в неправильном синтаксисе Java.

Ваш объект должен начинаться со строчной буквы

SuggestionService suggestion;

Ваш установщик должен начинаться также со строчной буквы, а имя объекта должно быть с заглавной буквы

public void setSuggestion(final Suggestion suggestion) {
    this.suggestion = suggestion;
}
15
ответ дан Community 7 December 2011 в 11:41
поделиться

Для меня это был случай, когда две компоненты реализовывали один и тот же интерфейс. Один из них был поддельным запретом ради юнит-теста, который противоречил оригинальному бину. Если мы используем

@component ("SuggestionServicefake")

, он все равно ссылается на SuggestionService. Поэтому я удалил @component и использовал только

@Qualifier ("SuggestionServicefake")

, который решил проблему

6
ответ дан vsingh 7 December 2011 в 11:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: