You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java EE RESTful服务JSON参数绑定至Java对象失败求助

问题分析与解决方案

先帮你拆解下当前遇到的两个核心问题:JSON格式无效导致解析失败,以及JAX-RS无法直接将请求体绑定到多个独立Java对象

1. 修复JSON格式错误

你当前的请求JSON写法不符合JSON语法规范,外层大括号里直接放置两个独立对象是不允许的——JSON对象的内容必须是键值对结构。异常信息里的Unexpected character ('{' (code 123)): was expecting double-quote to start field name,就是因为解析器在期望字段名(双引号开头)时,意外遇到了另一个{符号。

正确的JSON结构应该是一个顶层对象,包含mandantvertrag两个属性:

{
  "mandant": {
    "code": "SLV"
  },
  "vertrag": {
    "polizzenNummer": "1234"
  }
}

2. 解决参数绑定问题

根据JAX-RS规范,POST请求的请求体只能绑定到一个未添加特殊注解的参数(作为请求实体)。你现在的方法直接声明了MandantVertrag两个参数,框架无法自动将单个请求体拆分为两个独立对象,这也是参数绑定失败的关键原因。

解决办法是创建一个包装DTO类,把这两个对象作为属性整合在一起:

步骤1:创建包装类

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ClaimRegistrationRequest {
    private Mandant mandant;
    private Vertrag vertrag;

    // 必须提供无参构造器(JAX-RS和序列化框架要求)
    public ClaimRegistrationRequest() {}

    // Getter和Setter方法
    public Mandant getMandant() { return mandant; }
    public void setMandant(Mandant mandant) { this.mandant = mandant; }
    public Vertrag getVertrag() { return vertrag; }
    public void setVertrag(Vertrag vertrag) { this.vertrag = vertrag; }
}

步骤2:修改REST服务方法

把原来的两个参数替换为这个包装类:

@Path("claimserviceNew") 
public class SlsiRestServicesNew { 
    @POST 
    @Consumes({"application/xml", "application/json"}) 
    @Produces(MediaType.APPLICATION_JSON) 
    public String registerClaimWithPaymentNew(ClaimRegistrationRequest request){ 
        return request.getMandant().getCode() + " new " + request.getVertrag().getPolizzenNummer(); 
    } 
}

验证修改

现在用修正后的JSON发送POST请求,框架就能正确解析请求体并绑定到ClaimRegistrationRequest对象,进而获取到MandantVertrag的属性值了。

另外需要确认项目中已正确引入Jackson的JAX-RS依赖(比如jackson-jaxrs),这样框架才能完成JSON与Java对象的序列化/反序列化工作。

内容的提问来源于stack exchange,提问作者Alex Mi

火山引擎 最新活动