【问题标题】:Spring MVC - restriction on objects received using @RequestBodySpring MVC - 对使用 @RequestBody 接收的对象的限制
【发布时间】:2015-03-08 06:51:06
【问题描述】:

当我在@RequestBody 中使用具有继承的类时,我收到“400 Bad Request”。我有另一个控制器,我在其中使用没有继承的类并且它可以工作。

我想知道我是否可以在@RequestBody 中使用常规EJB,或者对可以使用的类有什么限制?

下面是控制器:

@RequestMapping(value = "auth/ping", method = RequestMethod.POST, consumes="application/json")
@ResponseStatus(HttpStatus.OK)
public @ResponseBody String pingPost(@RequestBody User model) {
    final String signature = CLASSNAME + "#pingPost(User model)";
    Helper.logEntrance(getLogger(), signature, new String[]{"model"}, new Object[]{model});
    return "unprotected ping post with data";
}

以下是类

public abstract class User extends AuditableEntity {

    @Indexed
    private String name;

    private String password;

    public User() {
        super();
    }


    public String getName() {
        return this.name;
    }

    public void setName(String value) {
        this.name = value;
    }

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String value) {
        this.password = value;
    }

}

public abstract class AuditableEntity {

    private User createdBy;

    private Date createdDate;

    public AuditableEntity() {
        super();
    }

    public User getCreatedBy() {
        return this.createdBy;
    }

    public void setCreatedBy(User value) {
        this.createdBy = value;
    }

    public Date getCreatedDate() {
        return this.createdDate;
    }

    public void setCreatedDate(Date value) {
        this.createdDate = value;
    }

}

我在 maven 中包含以下库

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.9.13</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.4.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.4.2</version>
    </dependency>

【问题讨论】:

  • 由于您提到 @RequestBody 适用于其他场景,我假设 Spring 配置是正确的。所以我会检查Json对象的格式是否正确。
  • 另外,打开 MVC 日志以进行调试,并找出错误的确切内容和位置。

标签: json spring spring-mvc model-view-controller


【解决方案1】:

继承工作得很好,你的问题是由于你的 User 类是一个抽象类。

当 Spring MVC 发现使用 @RequestBody 注释的参数时,它的参数解析机制启动,并在此过程中尝试创建类的实例,User在你的情况下上课。如果类不能像被标记为抽象时那样实例化,则该过程将失败。

我个人会创建和使用数据传输对象,但您也可以使用 EJB 类,只需确保删除抽象,或使用具体子类作为方法的参数

还请注意,使用抽象类作为方法参数是可以的,但您需要提供更多信息来帮助框架解决它。这在很大程度上取决于处理转换的消息转换器,因为您似乎使用的是 JSON 和 Jackson,您可以通过提供自定义反序列化器来处理它,所以这样的事情就可以了。

public ConcreteUser extends User {
}

然后用

注释您的 User 类
@JsonDeserialize(as=ConcreteUser.class)
public abstract class User extends AuditableEntity

【讨论】:

    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 2012-09-16
    • 2014-08-05
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    相关资源
    最近更新 更多