【发布时间】:2012-11-26 15:53:33
【问题描述】:
嗯,我在 MVC Spring 3 设计中从 Controller->Service->Repository 有 3 层。现在,我的问题是,由于默认范围定义为 Singleton,它们是线程安全的吗?
代码如下:
UserController.java
@Controller
@RequestMapping("/users")
public class UserController extends ExceptionExtension {
@Autowired
private IUserService userService;
@RequestMapping(value = { "/update", "/update/" }, method = RequestMethod.GET)
public String updateUser(@RequestParam("email") String eMail, ModelMap model)
throws Exception {
if (eMail.isEmpty() || eMail == null) {
throw new ArgumentIsEmptyException("Required String parameter 'email' is empty");
} else {
UserModel userModel = userService.setUser(eMail);
if (userModel != null) {
model.put("roleList", userService.setRoleList());
model.put("title", "Update Existing User");
model.put("post", "/users/post/update");
model.put("userForm", userModel);
return "users.update";
} else {
model.put("title", "Update Existing User");
model.put("result", "<font color='red'><u>" + eMail + "</u> does not exist in the database.</font>");
model.put("flag", "Error");
return "users.result";
}
}
}
}
用户服务.java
public class UserService implements IUserService {
@Autowired
private IUserManager userManager;
public UserModel setUser(String eMail) {
UserModel userModel = new UserModel();
Entity userEntity = userManager.getUser(eMail);
if (userEntity != null) {
userModel.setEMail(eMail);
userModel.setRole(userEntity.getProperty("role").toString());
userModel.setEnable((Boolean)userEntity.getProperty("enable"));
return userModel;
} else {
return null;
}
}
}
假设用户A和用户B同时运行相同的url但参数不同。
用户 A 请求 => "http://domain.com/users/update?user=myname1@domain.com"。
用户 B 请求 => "http://domain.com/users/update?user=myname2@domain.com"。
由于控制器是单例的,用户 A 的电子邮件变量是否会与用户 B 重叠,反之亦然?
我很难理解单例线程安全在这种情况下是如何工作的。我的 @Service 和 @Repository 是否应该声明为 @Scope("prototype) 以便内部方法变量与新实例隔离?
====>
使用 Scope("request") 到我的@Service 层,我遇到了这个错误消息:/
3328 [main] 错误 org.springframework.web.context.ContextLoader - 上下文初始化失败 org.springframework.beans.factory.BeanCreationException:错误 创建名为“roleController”的bean:注入自动装配 依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 自动装配字段:私有 com.company.dashboard.service.IRoleService com.company.dashboard.controller.RoleController.roleService;嵌套的 例外是 org.springframework.beans.factory.BeanCreationException: 创建名为“roleService”的 bean 时出错:范围“请求”不是 对当前线程有效;考虑为 如果您打算从单例中引用此 bean;嵌套的 异常是 java.lang.IllegalStateException: No thread-bound request 发现:您指的是实际之外的请求属性吗? Web 请求,或处理原始请求之外的请求 接收线程?如果您实际上是在 Web 请求中操作 仍然收到此消息,您的代码可能在外面运行 DispatcherServlet/DispatcherPortlet:在这种情况下,使用 RequestContextListener 或 RequestContextFilter 暴露当前 请求。
【问题讨论】:
标签: java google-app-engine spring-mvc thread-safety singleton