我有一个名为AuthenticationEndpoint的RESTful服务,它检查用户的用户名/密码对,创建令牌,将令牌保存到数据库并将令牌返回给应用程序客户端。 代码无错误和例外。 UserEJB bean应该将令牌保存到令牌数据库表,而AuthenticationEJB bean应该更新用户数据库表中的令牌字段。但正如我在MySQL Workbench中看到的,没有任何内容被保存或更新。 UserEJB.getUsers()方法正常工作并返回用户列表,似乎EJB容器找到了持久性单元 ForthDynamicWebProject ,但为什么我无法保存和更新实体?谢谢你的关注。
AuthenticationEndpoint RESTful服务
@ApplicationScoped
@Path("/authentication")
public class AuthenticationEndpoint {
@Inject
AuthenticateEJB authenticateEJB;
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response authenticateUser(String jsonString) {
Gson gson = new Gson();
Credentials credentials = gson.fromJson(jsonString, Credentials.class);
String userName = credentials.getUserName();
String password = credentials.getPassword();
try {
User user = authenticateEJB.checkUser(userName, password);
if ((user instanceof User) && user != null) {
return Response.ok().header("token", user.getToken().getToken()).build();
} else {
return Response.status(Response.Status.FORBIDDEN).build();
}
} catch (Exception e) {
return Response.status(Response.Status.FORBIDDEN).build();
}
}
}
以下是EJB的代码:
AuthenticateEJB
@LocalBean
@Stateless
public class AuthenticateEJB {
@PersistenceContext(unitName = "ForthDynamicWebProject")
EntityManager em;
@Inject
UserEJB userEJB;
public User checkUser(String userName, String password) {
List<User> users = userEJB.getUsers();
for (User user : users) {
if (user.getUsername().equals(userName) && user.getPassword().equals(password)) {
user.setToken(userEJB.updateToken());
em.merge(user);
return user;
}
}
return null;
}
}
UserEJB
@LocalBean
@Stateless
public class UserEJB {
@PersistenceContext(unitName = "ForthDynamicWebProject")
EntityManager em;
@Inject
Token token;
public List<User> getUsers() {
Query query = em.createQuery("from User");
return (List<User>) query.getResultList();
}
public Token updateToken() {
em.persist(token);
return token;
}
}
的persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="ForthDynamicWebProject" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>jdbc/second_attempt_hibernate</jta-data-source>
<class>converters.ConverterLocalDateTime</class>
<class>entity.DocStatus</class>
<class>entity.DocType</class>
<class>entity.Document</class>
<class>entity.Employee</class>
<class>entity.MailOrder</class>
<class>entity.MailOrderStatus</class>
<class>entity.Token</class>
<class>entity.User</class>
</persistence-unit>
</persistence>
更新
令牌实体
@Entity
@Table(name = "tokens")
@NamedQuery(name = "Token.findAll", query = "SELECT t FROM Token t")
public class Token implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Temporal(TemporalType.TIMESTAMP)
private Date loginTime;
private String token;
// bi-directional one-to-one association to User
@OneToOne(mappedBy = "token")
private User user;
public Token() {
ConverterLocalDateTime converter = new ConverterLocalDateTime();
loginTime = converter.convertToDatabaseColumn(LocalDateTime.now());
token = Double.toString(Math.random());
}
*getters and setters are not showed*
用户实体
@Entity
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String password;
private String username;
//bi-directional one-to-one association to Employee
@OneToOne(mappedBy="user")
private Employee employee;
//bi-directional one-to-one association to Token
@OneToOne
@JoinColumn(name="tokID")
private Token token;
public User() {
}
*getters and setters are not showed*
答案 0 :(得分:0)
也许我错过了一些东西,但是如果你的用户ejb意图绑定到单个用户,情况就不是这样了,因为无状态可以重复用于其他几个客户端,因此令牌将被重用ooled实例。检查这是否是正确的行为。
其次,您不能注入令牌JPA实体或至少不能注入当前代码,该变量将始终为null。也许这就是你没有看到它持续存在的原因。
第三,我还会改变其他事情,但这是另一个不同的问题。