java - JerseyTest 字段在资源中变为 NULL

标签 java jersey

由于某些奇怪的原因,我的实体的一个字段在我的资源中已更改为 NULL。

用户实体
User 实体包含:userName、firstName、lastName、email。 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();
}

postman
当我用 POSTMAN 发送数据时,没有问题:

标题

内容类型 application/json

原始内容

{
"firstName": "Erwin",
"lastName" : "Eberhard",
"email" : "erwin@gmail.com",
"userName": "erwineberhard" 
}  

如何使用我的 JerseyTest 获得心爱的 201?

更新 1

用户类

User 类扩展自通用 User 类:

@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();
}
}

GenericUser.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;
}  
}

最佳答案

看起来 protected getUserName() 是问题所在。序列化器在序列化时找不到 userName 属性,所以在该属性名的 JSON 中没有字段,当它消失时。当服务器获取 JSON 时,没有 "userName" 字段,因此它在服务器端对象中保持为空。要修复它,只需将方法设置为public

关于java - JerseyTest 字段在资源中变为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34373977/

相关文章:

java - 扫描仪双值 - InputMismatchException

java - 呈现的 JSF 不工作

java - Dropwizard 应用程序中带有 ChunkedOutput 和 JSON 的 Jersey

java - 奇怪的 Jersey 错误 : java. lang.StackOverflowError

java - JAX-RS Jersey JSON GET HTTP 状态 500 内部服务器错误

java - Dropwizard/Jersey 将 Java List 作为没有根节点的 JSON 返回

java - yarn 异常 : Unauthorized request to start container

java - 如何中断或停止当前正在运行的 quartz 作业?

java - 通过属性文件的 Restful url

java - 如何从 ContainerRequestContext JERSEY 2.1 获取 IP?