【发布时间】:2014-09-10 04:34:02
【问题描述】:
我的 REST API 中有一个用于登录用户的模型,对应于用户表(电子邮件和密码作为表列)
@Entity
public class User {
@Id
@GeneratedValues
private Long id;
private String email;
private String password;
+GET , +SET
}
然后是@Controller,它正在使用 JPAService 调用上述用户实体
@Controller
@RequestMapping("/rest/auths")
public class AuthController {
@Autowired
private UserService authService;
@RequestMapping(value = "/login", method = RequestMethod.POST)
public @ResponseBody ResponseEntity<AuthLoginFormResource> login(@RequestBody AuthLoginFormResource sentAuth) {
User user = authService.login(sentAuth.toUser());
AuthLoginFormResource res = new AuthLoginFormResourceAsm().toResource(user);
HttpHeaders headers = new HttpHeaders();
headers.setLocation(URI.create(res.getLink("self").getHref()));
return new ResponseEntity<AuthLoginFormResource>(res, HttpStatus.OK);
}
}
AuthLoginFormResource:-
public class AuthLoginFormResource extends ResourceSupport {
private String email;
private String password;
private boolean success;
public User toUser() {
User user = new User();
user.setEmail(email);
user.setPassword(password);
//user.setSuccess(false);
return user;
}
+GET, +SET
}
AuthLoginFormResourceAsm:-
public class AuthLoginFormResourceAsm extends ResourceAssemblerSupport<User, AuthLoginFormResource> {
public AuthLoginFormResourceAsm() {
super(User.class, AuthLoginFormResource.class);
}
@Override
public AuthLoginFormResource toResource(User user) {
AuthLoginFormResource res = new AuthLoginFormResource();
res.setEmail(user.getEmail());
res.setPassword(user.getPassword());
//res.setSuccess(user.isSuccess()); // Success is not existing in USER
res.add(linkTo(AuthController.class).withSelfRel());
return res;
}
}
有两个问题 -
-
我需要发送一个成功标志作为布尔值作为响应,为此我已将布尔值成功添加到 AuthLoginFormResource。但是, AuthLoginFormResource 被设置 仅来自 AuthLoginFormResourceAsm.toResource 方法,而后者又可以 它来自实体用户。作为用户实体模型数据库,其中有 没有成功栏,我无法在这个地方设置成功。
那么,我应该将虚拟成功字段添加到用户实体并从服务中设置吗 方法,虽然数据库中没有这样的字段或在这里创建一个表示登录表单的新实体并返回?
作为身份验证令牌的另一个字段存在相同问题 它在数据库中不存在,但作为响应的一部分。
在 ResourceSupport 对象中设置此类字段的正确位置是什么 - 在数据库实体内部并从服务返回/在域模型之上创建另一个表单模型实体并从服务返回。
这是我在数据模型和表单不一对一匹配的许多地方面临的基本问题。
【问题讨论】:
-
现在,我添加了一个名为 UserAuth 的新模型,它扩展了 User 并修改了 Service 以返回 UserAuth 而不是 User。 UserAuth 包含 REST 响应所需的 User 顶部的其他字段
-
如果您的实体和 ResourceSupport 对象相同(关于字段),那么您不需要单独的类。
标签: java spring spring-mvc spring-hateoas