Использование @RolesAllowed на контроллере и получение «объект не является экземпляром объявления класса» - PullRequest
3 голосов
/ 07 февраля 2012

Я пытаюсь использовать метод Security, поэтому я поставил на dispatcher-servlet.xml (security.xml находится в другом контексте):

<security:global-method-security secured-annotations="enabled" jsr250-annotations="enabled" />

И положить @RolesAllowed на контроллер:

@SessionAttributes({"sessionCompanyDetails"})
@Controller
@RequestMapping("/company")
@RolesAllowed("ROLE_ADMIN")
public class CompanyController extends BaseController {
  ...

Я понял, что когда я использую эти аннотации, Spring создает Proxy to Controller, и из-за этого я получаю ошибку:

java.lang.IllegalArgumentException:object is not an instance of declaring class

Ответы [ 2 ]

2 голосов
/ 04 января 2013

Проблема возникает из-за того, что у контроллера нет интерфейса, поэтому Spring создает прокси, но не может привести его к классу контроллера.

Возможные решения:

  1. Перехватчик: используя MethodSecurityInterceptor и AccessDecisionManager
  2. Используя <global-method-security proxy-target-class="true"/>, которые активируют прокси-сервер CGLib (прокси-класс является подклассом), поэтому Spring может привести его.
  3. Создать интерфейс для контроллера.
  4. Используя ApectJ.

Я протестировал все решения, кроме ApectJ.Я использую решение CGLib для одного проекта, а для другого я использую Interceptor, оба решения работают нормально.

0 голосов
/ 13 февраля 2012

Пожалуйста, дайте нам больше информации.

  1. Возникла исключительная ситуация с определенным номером строки кода (причина)?
  2. Хотите использовать аннотации JSR250 (@RolesAllowed) или аннотации Spring-Way (@Secured)?
...