Java JerseyTest字段在资源中变为空
由于某种奇怪的原因,我的实体的一个字段在我的资源中被更改为NULL 用户实体Java JerseyTest字段在资源中变为空,java,jersey,Java,Jersey,由于某种奇怪的原因,我的实体的一个字段在我的资源中被更改为NULL 用户实体 用户实体包含:用户名、姓氏、姓氏、电子邮件。JerseyTest实例化一个新的用户对象: newUser = new User(); newUser.setEmail(getEmail()); newUser.setFirstName("Erwin"); newUser.setLastName("Eberhard"); newUser.setUserName("abc"); 在
用户实体包含:用户名、姓氏、姓氏、电子邮件。JerseyTest实例化一个新的用户对象:
newUser = new User();
newUser.setEmail(getEmail());
newUser.setFirstName("Erwin");
newUser.setLastName("Eberhard");
newUser.setUserName("abc");
在测试中发送实体在发送数据之前,测试中的日志会告诉我:
[main] INFO feature.AccountStepDefinition - Erwin Eberhard erwin
erwineberhard@gmail.com
一切似乎都正常,因此测试将数据发送到资源:
logger.info(newUser.toString());
responseUser = target("auth/register").request().post(Entity.json(newUser), User.class);
会计资源AccountResource检索用户,日志告诉我们:
[qtp1533672820-20] INFO nl.bolt.ffinschrijven.controllers.AccountsController
- Erwin Eberhard null erwineberhard@gmail.com
由于某些原因,用户名已更改为NULL
AccountResource中的方法
@POST
@Path("/register")
@ApiOperation(value = "Register user.", notes = "After registration a JWT token has been added as header value.")
@ApiResponse(code = 200, message = "", response = User.class, responseHeaders = @ResponseHeader(name = "X-FFI-AUTH", description = "Token generated after authentication", response = String.class) )
@Consumes("application/json")
public Response callback(User user) {
logger.info(user.toString());
ServiceResult serviceResult = accountService.register(user);
if (serviceResult.serviceState == ServiceState.success) {
String jwt = "Bearer " + JwtHelper.createJWT(UUID.randomUUID().toString(), ApiConfiguration.issuer,
user.getEmail(), Long.valueOf(ApiConfiguration.token_ttl));
return Response.status(201).entity(serviceResult.content).header("Authorization", jwt).build();
}
if (serviceResult.serviceState == ServiceState.invalid) {
return Response.status(400).entity(serviceResult.responseMessages.toString()).build();
}
return Response.status(500).build();
}
邮差当我与邮递员一起发送数据时,没有问题: 标题 内容类型应用程序/json 原始内容 如何通过我的运动衫测试获得心爱的201 更新1
@POST
@Path("/register")
@ApiOperation(value = "Register user.", notes = "After registration a JWT token has been added as header value.")
@ApiResponse(code = 200, message = "", response = User.class, responseHeaders = @ResponseHeader(name = "X-FFI-AUTH", description = "Token generated after authentication", response = String.class) )
@Consumes("application/json")
public Response callback(User user) {
logger.info(user.toString());
ServiceResult serviceResult = accountService.register(user);
if (serviceResult.serviceState == ServiceState.success) {
String jwt = "Bearer " + JwtHelper.createJWT(UUID.randomUUID().toString(), ApiConfiguration.issuer,
user.getEmail(), Long.valueOf(ApiConfiguration.token_ttl));
return Response.status(201).entity(serviceResult.content).header("Authorization", jwt).build();
}
if (serviceResult.serviceState == ServiceState.invalid) {
return Response.status(400).entity(serviceResult.responseMessages.toString()).build();
}
return Response.status(500).build();
}
User.class
@MappedSuperclass
public abstract class GenericUser implements IEmail{
@NotNull(message="Gebruikersnaam niet meegegeven.")
@Column(name="userName", nullable = false)
protected String userName;
@NotNull(message="Email niet meegegeven.")
@Column(name="email", nullable = false)
protected String email;
@NotNull(message="Voornaam niet meegegeven.")
@Column(name="firstName", nullable = false)
protected String firstName;
@NotNull(message="Achternaam niet meegegeven.")
@Column(name="lastName", nullable = false)
protected String lastName;
@Column(name="locked", nullable = false)
protected Boolean locked;
protected String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Boolean getLocked() {
return locked;
}
public void setLocked(Boolean locked) {
this.locked = locked;
}
}
用户类从通用用户类扩展而来:
@Entity
@Table
public class User extends GenericUser {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@OneToMany(mappedBy="user", cascade=CascadeType.ALL)
private List<Eventcomponent> eventcomponents =
new ArrayList<Eventcomponent>();
public Long getId() {
return id;
}
@Override
public String toString(){
return this.getFirstName() + " " + this.getLastName() + " " + this.getUserName()
+ " " + this.getEmail();
}
}
看起来问题出在
受保护的getUserName()
上。序列化程序在序列化时找不到userName
属性,因此当属性名消失时,该属性名的JSON中没有字段。当服务器获取JSON时,没有“userName”
字段,因此它在服务器端对象中保持为空。要修复它,只需将方法设置为public
1)显示用户类。2) 回调
方法何时会产生用户
响应?为什么要执行.post(Entity.json(newUser),User.class)
?@peeskillet 1)查看我的更新2)我使用这个工具:。在用户中发送原始json结果,例如:{“email”:erwin2@gmail.com“,“firstName”:“Erwin”,“lastName”:“Eberhard”,“locked”:false,“id”:21}
3)我已将.post…
更改为post(Entity.json(newUser))
,我认为读取响应需要添加User.class。2)post
方法的第二个参数表示响应应该反序列化为用户。但是看看resource方法,它看起来不像用户
会被返回。我可能错了。相反,只需为post
方法使用一个参数,它将返回响应。从响应中
至少可以检查状态代码之类的内容。您可以使用type message=response.readEntity(TheType.class)
反序列化响应实体,您又做了一次!非常感谢。