java - 在同一方法上使用 @Secured 和 @RequestMapping 时出现 ClassFormatError

标签 java spring-mvc spring-security

当我尝试在已注释的 @Controller 方法中使用 @Secured@PreAuthorize 时,抛出了一个奇怪的错误@RequestMapping。当我尝试启动应用程序时(在 win 7 32 位上使用 spring STS 2.8.1 和 vFabric 2.6.1,同时使用 springframework 和 spring security 3.1),它给了我以下错误:

Caused by: java.lang.ClassFormatError: Duplicate method name&signature in class file com/dnp/web/controllers/HomeController
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2820)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1150)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523)
    at org.springframework.util.ClassUtils.forName(ClassUtils.java:258)
    at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:417)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1283)
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1254)
    ... 43 more

Controller 代码:

@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    @PreAuthorize("hasRole('ROLE_USER')")
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info("Welcome home! the client locale is "+ locale.toString());

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute("serverTime", formattedDate );

        return "home";
    }
}

我不知道为什么会抛出这个错误,也没有在互联网上找到任何关于它的信息。此外,服务层上的安全注释也可以正常工作。

PD:完整的应用程序跟踪位于:http://pastebin.com/raw.php?i=VxdYPDXL ,安全性和 servlet 上下文的主要部分都在这里:http://pastebin.com/cva5VgkH

最佳答案

@rabusmar,我从 SpringForum 获得此链接 http://forum.springsource.org/showthread.php?109850-RequestMapping-and-PreAuthorize-not-compatible

似乎预授权和请求映射不兼容。他们在页面末尾给出了解决方案。尝试一下。

此外,当已经由一个注释检测的类再次由另一个注释检测时,会出现 ClassFormatError ,在您的情况下,HomeController 可能已经由 PreAuthorize 检测,并再次由 RequestMapping 检测,反之亦然,这就是您获得类格式错误。

您可以尝试我上面给出的 Spring 论坛链接中给出的解决方案。

关于java - 在同一方法上使用 @Secured 和 @RequestMapping 时出现 ClassFormatError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9741133/

相关文章:

grails spring security 自定义 userDetailsS​​ervice

spring - Grails Spring Security Core插件无法正常工作

java - 使用 JAVA 将字符串拆分为多个部分并存储为 CSV

java - 如何在 Spring 'HandlerMethodArgumentResolver' 中多次读取请求正文?

java - 带有 JSON 和 XML 的 Spring REST

java - 创建名称为 'conversionService' 的 bean 时出错

spring-security - Spring Boot - Redis 持久化 token

java - 更改密码按钮 - 如何覆盖当前用户密码?

java - Java 中使用原始类型方法的类型不匹配

Java 无法用于 Opencv 安装