Java 使用springmvc的私有方法
我的控制器中有两种方法:Java 使用springmvc的私有方法,java,spring-mvc,Java,Spring Mvc,我的控制器中有两种方法: 公开的方法 私有方法 它们都有@requestMapping,并且都引用了一个全局变量(@autowrite)。问题是第一个方法变量有值,第二个方法变量为null 请帮帮我 /** * Both of these methods are accessible through the browser, * when i ask for query1 the flowService has value but * when
@requestMapping
,并且都引用了一个全局变量(@autowrite
)。问题是第一个方法变量有值,第二个方法变量为null
请帮帮我
/**
* Both of these methods are accessible through the browser,
* when i ask for query1 the flowService has value but
* when i ask for query2 the flowService is null.
* My spring version is 4.2.4
* Created by hanxiaofei on 2017/10/12.
*/
public class TestController {
@Autowired
private FlowService flowService;
@RequestMapping(value = {"/query1"})
@ResponseBody
public CommonListResult<WorkOrderMO> query1() {
return flowService.queryWorkOrderList(1);
}
@RequestMapping(value = {"/query2"})
@ResponseBody
private CommonListResult<WorkOrderMO> query2() {
return flowService.queryWorkOrderList(1);
}
}
/**
*这两种方法都可以通过浏览器访问,
*当我要求查询1时,flowService有价值,但
*当我请求查询2时,flowService为空。
*我的spring版本是4.2.4
*韩晓飞于2017年10月12日创作。
*/
公共类TestController{
@自动连线
私人流动服务;
@请求映射(值={“/query1”})
@应答器
公共CommonListResult查询1(){
返回flowService.queryWorkOrderList(1);
}
@请求映射(值={“/query2”})
@应答器
私有CommonListResult查询2(){
返回flowService.queryWorkOrderList(1);
}
}
使用@RequestMappings注释的控制器方法必须是公共的,才能正常工作。无论如何,没有理由将请求方法设置为私有的,因为您不应该自己从不同的组件调用控制器方法。如果您不想调用它,那么声明它有什么好处,由于私有性质,您不能从任何其他类调用它,也不能从其他类调用控制器方法,并且您不想从浏览器调用它,因为您将无法调用它
那么,您如何测试flowService
在query2
方法中是否为null,因为您不会从任何地方调用它
但是,您的问题与此私有和公共控制器方法无关,这是另一回事,因为flowService
是一个实例变量,如果query1
方法能够访问它,那么query2
也应该能够访问它。Spring MVC控制器适用于任何范围:public
、private
、protected
或package private access modifier
您可以使用此工作正常的示例控制器对其进行验证:
@RestController
public class TestController {
@Autowired
private FlowService flowService;
@RequestMapping("/query1")
public List<String> query1() {
return flowService.queryWorkOrderList(1);
}
@RequestMapping("/query2")
private List<String> query2() {
return flowService.queryWorkOrderList(2);
}
@RequestMapping("/query3")
protected List<String> query3() {
return flowService.queryWorkOrderList(3);
}
@RequestMapping("/query4")
List<String> query4() {
return flowService.queryWorkOrderList(4);
}
}
@RestController
公共类测试控制器{
@自动连线
私人流动服务;
@请求映射(“/query1”)
公共列表查询1(){
返回flowService.queryWorkOrderList(1);
}
@请求映射(“/query2”)
私有列表查询2(){
返回flowService.queryWorkOrderList(2);
}
@请求映射(“/query3”)
受保护列表查询3(){
返回flowService.queryWorkOrderList(3);
}
@请求映射(“/query4”)
列表查询4(){
返回flowService.queryWorkOrderList(4);
}
}
我已经用Spring Framework4.3.11.RELEASE
对它进行了测试,所以您发行的第一件事就是使用可用的最新版本
也就是说,我不明白为什么有人想使用private
controller方法public
是最常用的,但不指定作用域会更短,并产生相同的结果(query4()
,在我的示例中).除非您发布示例代码,说明您所面临的问题,否则很难为您提供帮助。请向我们展示一些代码。您可以发布代码,并向我们展示您在哪一行获得空值。谢谢大家,我已经添加了一些代码。谢谢,但我不能像我的代码展示那样通过浏览器请求私有方法。方法确实会被调用,但在特殊的代理上,它没有@Autowired字段,因此您的结果。例如,这同样适用于使用@modeldattribute
注释的私有方法@RequestMapping
方法是公共的。所以不同的原因是java不是spring,我知道spring可以忽略private,但我不明白为什么当我请求query2方法时它是空的,它们都使用flowservice属性,属性属于同一个容器。我知道我应该使用公钥,但我想知道为什么在合法的情况下它是无效的@韩晓飞 我不是Spring专家,我不知道内部结构,所以我不知道这种细节级别。谢谢Antoniossss^谢谢你的回答,但我想知道为什么当我通过brower询问query2时flowservice是空的。唯一的区别是query1使用pulic,query2使用private。你能解释一些细节吗?谢谢Deleze,是的,private方法工作正常,但是private方法中引用的全局变量为空。就像我的代码中的flowservice一样。我已经更新了我的示例,并且对flowservice
的引用正常。如果您仍然看到问题,请提供一个复制项目。