仅当填写了所有字段时,才使用JAXB将JSON转换为Object

时间:2014-09-09 09:54:41

标签: java json rest jaxb jersey

我正在使用Jersey构建RESTful Web服务。我使用JAXB将传入的JSON对象转换为Java对象。不幸的是,这种方法允许创建不具有所有必填字段的Java对象。如果我有3个必填字段,但JSON只包含1个字段,我希望看到抛出异常。

资源类:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Resource {
  private int    field1;
  private String field2;
  private String field3;

  public Resource() {

  }

  ...
}
REST类:
@Path("resource")
public class ResourceREST {

  ...

  @POST
  @Consumes(APPLICATION_JSON)
  @Produces(TEXT_PLAIN)
  public String createResource(Resource resource) {
      ...
  }

  ...
}

有没有可能用JAXB做到这一点?如果没有,我如何实现此输入验证?

提前致谢!

1 个答案:

答案 0 :(得分:1)

我已经完成了相同的方案,并在生成JSON后应用了一些逻辑来解决这个问题。

在列表中添加您认为是必需的Field Names

public static final List<String> REQUIRED_FIELDS = new ArrayList<String>();
    static {
        REQUIRED_FIELDS.add("Field1");
        REQUIRED_FIELDS.add("Field2");
    };

将您构建的JSON发送给验证方法。

您的验证方法应该是这样的。

public void validateRequiredFields(JSONObject jsonObject, List<String> requiredFields) throws ParserException, Exception {
        if (log.isDebugEnabled()) {
            log.debug("Entering validateForRequiredFields");
        }
        List<String> missingFields = new ArrayList<String>();
        try {
            if (requiredFields != null) {
                for (String requiredField : requiredFields) {
                    if (ifObjectExists(jsonObject, requiredField)) {
                        if (StringUtils.isEmpty(jsonObject.getString(requiredField))) {
                            missingFields.add(requiredField);
                        }
                    } else {
                        missingFields.add(requiredField);
                    }
                }
            }
            if (missingFields != null && missingFields.size() > 0) {
                throw new Exception(missingFields);
            }
        } catch (JSONException e) {
            throw new ParserException("Error occured in validateRequiredFields", e);
        }
    }