Hi Daniel,
This is a reasonable fix. Can you open a ticket in the issue
tracker? If you'd care to submit a patch with unit tests, that would
be even better.
Thanks,
Rhett
On Feb 16, 2009, at 12:50 AM, Daniel Woo wrote:
> Hi guys,
>
> The SpringBeanRouter.resolveUri() method in 1.1.1 has a potential
> problem, if you specify restlet in Spring configuration file without
> an id like this way:
>
> <bean name="/product-folders" scope="prototype" class="..."> </bean>
>
> Your BeanFinder will never be attached the URI "/product-folders".
> The reason is that the resolveUri() method tries to get name and
> other aliases from id, see the code below
>
> protected String resolveUri(String resourceName,
> ConfigurableListableBeanFactory factory) {
> for (final String alias : factory.getAliases(resourceName)) {
> if (alias.startsWith("/")) {
> return alias;
> }
> }
>
> return null;
> }
>
> if you don't specify and ID in the Spring configuration file
> factory.getAliases(resourceName) will return null when the passed in
> resourceName is actually the bean name.
> To workaround this, you have to specify an ID for each restlet, eg,
> <bean id="_product-folders" name="/product-folders"
> scope="prototype" class="..."> </bean>
>
> Note, the id cannot be the same as the name because XML id cannot
> contain characters in URI like "/" or "{id}". Also, it's troublesome
> to specify id for each bean. So, how can I just simply specify name
> without IDs?
>
> I made it by changing resolveUri as below
>
> protected String resolveUri(String resourceName,
> ApplicationContext factory) {
> String aliasName = null;
> if (resourceName.startsWith("/")) {
> aliasName = resourceName;
> } else {
> for (final String alias :
> factory.getAliases(resourceName)) {
> if (alias.startsWith("/")) {
> aliasName = alias;
> break;
> }
> }
> }
> logger.debug("resolveUri: alias=" + aliasName);
> return aliasName;
> }
>
> I first check resourceName, if you don't specify an ID, bean name
> will be passed in as resourceName, in this case, just return the
> beanName if it starts with a slash.
> If you specify an ID, bean id will be passed in, then getAliases()
> will return the beanName of that id. it's done.
>
> Tested with 1.1.1
>
> What do you guys think?
>
> Regards,
> Daniel
>
> ------------------------------------------------------
> http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=1169062
------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=1171440