JAX-B仅从输出中排除字段,但允许输入

时间:2017-12-13 16:31:35

标签: java rest jersey moxy jaxb2

有没有办法允许字段作为输入但是在JAX-B中将其从输出中排除?我添加了@XMLTransient,但这会阻止该字段用作输入字段。我正在使用Jersey 2.25.1和Moxy。

该方案是用户记录上的密码字段。我想在创建新用户记录时允许它传入,但我不希望将其作为用户POJO的一部分包含在任何响应中。

编辑: 我尝试了@XmlReadOnly属性,似乎已经完成了这个伎俩。它是org.eclipse.persistence.oxm.annotations包的一部分。

1 个答案:

答案 0 :(得分:0)

一种方法是使用XmlAdapter。您可以在unmarshal()上返回结果,并在null

上返回marhsall()
public class OnlyInputAdapter extends XmlAdapter<String, String> {

    @Override
    public String unmarshal(String s) throws Exception {
        return s;
    }

    @Override
    public String marshal(String v) throws Exception {
        return null;
    }
}

然后只需注释模型上的密码属性

@XmlJavaTypeAdapter(OnlyInputAdapter.class)
public String getPassword() {
    return this.password;
}

这是一个测试

public class PasswordSerializationTest extends JerseyTest {

    private User serverUser;

    @Path("test")
    @Produces("application/json")
    @Consumes("application/json")
    public class TestResource {

        @POST
        public User postUser(User user) {
            serverUser = user;
            return user;
        }
    }

    @Override
    public ResourceConfig configure() {
        return new ResourceConfig().register(new TestResource());
    }

    @Test
    public void doIt() {
         User clientUser = target("test")
                .request()
                // post string; can't post User as the
                // password field wouldn't serialize
                .post(Entity.json("{\"password\":\"secret\"}"), User.class);

         assertThat(serverUser.getPassword()).isEqualTo("secret");
         assertThat(clientUser.getPassword()).isEqualTo(null);
    }
}