使用Spring @Controller注解保持方法可见性的最佳实践

7

我目前工作的项目使用private访问修饰符来修改MVC控制器的方法:

@Controller
public class HelloWorldController {

    @RequestMapping("/helloWorld")
    private ModelAndView helloWorld() {

我已经集成了PMD,他的报告有很多:

/src/main/java/com/web/controller/SignalController.java:91: Avoid unused private
                                            methods such as 'handleNewRequest()'.

因此,我认为应该将控制器方法的可见性更改为public,而不是禁用有用的PMD规则。

保留控制器方法private的原因是什么?


4
在我看来,这么做不仅毫无意义,而且也意味着它们没有经过测试。Spring框架的价值之一是可以很容易地对控制器进行单元测试,而不必担心原始HTML解析(或其他丑陋的策略),这也与其返回数据的能力有关。 - Colin M
同意Colin的观点。保留控制器方法的私有性似乎没有任何价值。通常情况下,测试私有方法需要使用反射,这是一件麻烦的事情。如果你必须测试私有方法,可以使用像JMockit的Deencapsulation工具。 - Durandal
1
我们使用 SpringJUnit4ClassRunnerHandlerAdapterMockHttpServletRequest + MockHttpServletResponse。因此,将方法保持为私有并不会使测试变得不可能)) - gavenkoa
2
通过将其设置为私有,你会自食其果:1. PMD和IDE(以及所有被调用的其他私有方法)认为它未使用。因此,你或同事可能会错误地删除实际上被使用的私有方法。2. 这使得对它们进行单元测试变得更加困难。3. 这是不常规的,会让经验丰富的Spring开发人员觉得你的代码看起来很奇怪。4. 它们在逻辑上是公共的,因为它们被类和包之外的代码调用。 - JB Nizet
@JBNizet,您介意将评论作为答案吗? - gavenkoa
1个回答

14

将其设为私有,你就是在给自己找麻烦:

  1. 这会被PMD和IDE视为未使用(以及调用的所有其他私有方法),所以你或同事可能会错误地删除实际上被使用的私有方法。
  2. 这会让它们更难进行单元测试。
  3. 这是不传统的,对于有经验的Spring开发人员来说,你的代码看起来很奇怪。
  4. 它们在逻辑上是公共的,因为它们被类和包之外的代码调用。

我发现在私有的@RequestMapping方法中,自动装配的依赖项为null,但当我将其改为公共的时,依赖项就可以使用了。 - VPK
1
  1. 无论如何,在Spring使用反射执行它们的情况下,它们在IDE中都会被视为未使用。
  2. 这是正确的,但个人认为我会使用集成测试而不是单元测试来测试RestController,在这种情况下,它们也是通过反射执行的。
  3. 同意。
  4. 同意。
顺便说一句,我来这里是想了解将它们设置为包访问权限的缺点,以防止其他开发人员硬编码直接调用它们。
- Jason Hendriks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接