Spring аннотированный бин контроллера в контексте приложения - PullRequest
3 голосов
/ 21 сентября 2011

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

Как передать конструкторы-аргументы в контроллер без получения дублированных сообщений об ошибках?

Мой контекст приложения:

 <context:component-scan base-package="org.brickred.socialauth.spring.controller" />

 <bean id="socialAuthWebController" class="org.brickred.socialauth.spring.controller.SocialAuthWebController">
    <constructor-arg value="http://www.mysite.com/" />
    <constructor-arg value="/authSuccess.html" />
    <constructor-arg value="/failed.html" />
 </bean>

 <tx:annotation-driven transaction-manager="txManager"/>

Аннотированный контроллер:

    @Controller
    @RequestMapping("/socialauth")
    public class SocialAuthWebController {

    private String baseCallbackUrl;
    private String successPageURL;
    private String accessDeniedPageURL;
    @Autowired
    private SocialAuthTemplate socialAuthTemplate;
    @Autowired
    private SocialAuthManager socialAuthManager;
    private final Log LOG = LogFactory.getLog(getClass());

    /**
     * Constructs a SocialAuthWebController.
     * 
     * @param applicationUrl
     *            the base URL for this application (with context e.g
     *            http://opensource.brickred.com/socialauthdemo, used to
     *            construct the callback URL passed to the providers
     * @param successPageURL
     *            the URL of success page or controller, where you want to
     *            access sign in user details like profile, contacts etc.
     * @param accessDeniedPageURL
     *            the URL of page where you want to redirect when user denied
     *            the permission.
     */
    @Inject
    public SocialAuthWebController(final String applicationUrl,
                    final String successPageURL, final String accessDeniedPageURL) {
            this.baseCallbackUrl = applicationUrl;
            this.successPageURL = successPageURL;
            this.accessDeniedPageURL = accessDeniedPageURL;
    }
    ...

Остальная часть исходного кода на http://code.google.com/p/socialauth/source/browse/trunk/socialauth-spring/src/org/brickred/socialauth/spring/controller/SocialAuthWebController.java

Я получаюследующая ошибка:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'socialAuthWebController' defined in URL [jar:file://Tomcat%207.0/webapps/ROOT/WEB-INF/lib/socialauth-spring-2.0-beta2.jar!/org/brickred/socialauth/spring/controller/SocialAuthWebController.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [java.lang.String]: : No matching bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

Ответы [ 3 ]

3 голосов
/ 21 сентября 2011

Вы получаете сообщение об ошибке, поскольку один и тот же контроллер определен как в XML, так и в аннотациях, как отмечалось в других публикациях.Удалите XML-конфигурацию контроллера и выполните следующие действия:

Поскольку URL-адреса успеха и неудачи на самом деле не являются значениями конфигурации, а определены в вашем приложении, переместите их либо 1) непосредственно в метод обработчика в виде жестко заданных значенийили 2) если они являются общими для более чем одного метода или Контроллера, переместите их как константы в BaseController, который расширяют все остальные Контроллеры.Тогда вы полностью избежите проблем с DI для этих двух аргументов.

Это оставляет baseCallbackUrl.Если это значение зависит от URL-адреса приложения, возможно, сделайте это значение системной переменной и введите его напрямую, используя @Value, как показано ниже:

@Value("#{systemProperties.baseCallbackUrl}")
private String baseCallbackUrl;
2 голосов
/ 21 сентября 2011

Я думаю, что компонентное сканирование загружает контроллер, и ваш bean-компонент загружается снова, поскольку он определен в xml (bean id="socialAuthWebController").

Можете ли вы попробовать комментировать либо компонент-scan, либо объявление bean-компонента?<context:component-scan base-package="org.brickred.socialauth.spring.controller" />

0 голосов
/ 21 сентября 2011

Возможно, попробуйте объявить имя значения. См. Весенняя документация

<constructor-arg name="applicationUrl" value="http://www.mysite.com/" /> 

Я думаю, что у Spring может быть проблема, потому что он не знает, куда и куда идет String Таким образом, вы можете использовать «имя» или «индекс», чтобы дать ему знать.

По ссылке: «Если в аргументах конструктора определения компонента отсутствует потенциальная неоднозначность, то порядок, в котором аргументы конструктора определены в определении компонента, является порядком, в котором эти аргументы передаются соответствующему конструктору при боб создается "

Существует двусмысленность, так как вы используете все строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...