【问题标题】:Json to Spring Expression mapping exceptionJson 到 Spring 表达式映射异常
【发布时间】:2020-11-13 14:50:01
【问题描述】:

当我尝试发出具有如下请求正文的 POST 请求(来自邮递员)时,我面临映射异常:

类型定义错误:[简单类型,类org.springframework.expression.spel.support.ReflectiveMethodResolver];嵌套异常是 com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.springframework.expression.spel.support.ReflectiveMethodResolver 并且没有发现创建 BeanSerializer 的属性(为避免异常,禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS)(通过参考链:com.freddiemac.security.policy.Policy["accessPolicies"]->java.util.ArrayList[0]->com.freddiemac.security.policy.AccessPolicy["condition"]->org.springframework.expression .spel.standard.SpelExpression["evaluationContext"]->org.springframework.expression.spel.support.StandardEvaluationContext["methodResolvers"]->java.util.ArrayList[0])

POST 调用 - 请求正文:

{
"accessPolicies": [{
    "policyId": 1,
    "resource": [
        "/my-resource"
    ],
    "action": [
        "POST"
    ],
    "condition": "#claims['userRoles'].contains('developer')", // this is mapped as Spring expression in java
    "effect": "Allow"
}]

}

POJO 类:

private String policyId;
private List<String> resource;
private List<String> action; 
private List<String> role;
private Expression  condition; // import from :  org.springframework.expression.Expression;

你能帮我解决这个问题吗?提前致谢。

【问题讨论】:

  • 你需要一个 serviceIdversionaccessPolicies 的包装类作为你当前 POJO 的列表来匹配 json 响应。

标签: java json spring


【解决方案1】:

Expression 接口没有序列化器,所以接收String,它确实有有效的序列化器。

然后你可以使用SpelExpressionParserparse String into a valid Expression

class PostRequestDto {

    private String serviceId;
    private String version;
    private List<AccessPolicy> accessPolicies;
    // Getters and setters omitted for brevity
}

class AccessPolicy {
    private String policyId;
    private List<String> resource;
    private List<String> action;
    private List<String> role;
    private String condition; // utilize String serializer when accepting SpEL Expression
    private String effect;

    // Getters and setters omitted for brevity

    // parse received String to derive SpEL Expression 
    public Expression getConditionExpression() {
        // proper error handling omitted for brevity
        ExpressionParser expressionParser = new SpelExpressionParser();
        return expressionParser.parseExpression( this.condition );
    }
}

【讨论】:

  • @RajeshYarraguntla 不客气。我很高兴它有所帮助。
猜你喜欢
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多