Ниже приведено минимальное воспроизведение:
pub struct Canvas;
impl Canvas {
fn color(&self) -> &Canvas { self }
}
fn main() {
let mut canvas = Canvas.color();
// 1 ^~~~~~
// 2 ^~~~~
}
Проблема возникает из-за того, что вы создаете временную переменную (1), а затем передаете ссылку на эту переменную методу (2), который возвращает ссылку. В конце цепочки методов вы пытаетесь вернуть ссылку и сохранить ее в переменной, но ссылка указывает на временный элемент, который негде жить ! Rust не позволяет ссылаться на что-то недопустимое.
Часть проблемы состоит в том, что этот не является шаблоном Builder , это просто структура, которая модифицирует себя, используя вызов цепочки методов . Некоторые решения:
self
вместо ссылаться на self (&self
, &mut self
), а затем в конечном итоге возвращать полную структуру. build
в конце цепочки, который возвращает другую автономную структуру, а не ссылку. Если я не ошибаюсь, имя 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 переопределит определение аннотации.
Если у вас есть 2 бина одного и того же класса, автоматически подключенных к одному классу, вы должны использовать @Qualifier
( Пример Spring Autowiring @Qualifier ).
Но, похоже, ваша проблема в неправильном синтаксисе Java.
Ваш объект должен начинаться со строчной буквы
SuggestionService suggestion;
Ваш установщик должен начинаться также со строчной буквы, а имя объекта должно быть с заглавной буквы
public void setSuggestion(final Suggestion suggestion) {
this.suggestion = suggestion;
}
Для меня это был случай, когда две компоненты реализовывали один и тот же интерфейс. Один из них был поддельным запретом ради юнит-теста, который противоречил оригинальному бину. Если мы используем
@component ("SuggestionServicefake")
, он все равно ссылается на SuggestionService. Поэтому я удалил @component и использовал только
@Qualifier ("SuggestionServicefake")
, который решил проблему