首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泽西损坏JSON的数据?

泽西损坏JSON的数据?
EN

Stack Overflow用户
提问于 2017-12-01 21:40:53
回答 1查看 46关注 0票数 0

我们有一个使用泽西框架实现的REST服务,它允许用户从UI中保存配置信息。有一个GET (获取当前配置信息)和一个相应的POST来保存设置。该数据保存在JSON文件中。GET很好地工作,POST exept对于一个值也是如此:

代码语言:javascript
复制
"modulation": 2,

无论将此值设置为什么,当从POST中的UI获取数据时,它始终是默认的。其他所有的价值都是完美的。

这个值过去是一个枚举,由于文件中的所有内容都保存为一个intString,所以我认为这可能会混淆它。所以我把它改成了int。这没什么用。从好的方面来说,这也没有让事情变得更糟。

使用good ol‘Postman,我发送一个带有POST的JSON结构:

代码语言:javascript
复制
{
    "customers": {
        "max": 20,
        "current": 2
    },
    "window": {
        "x": 10,
        "y": 10,
        "width": 20,
        "height": 20
    },
    "modulation": 2,    // always just the default, 1
    "pointsOfConsternation": 20
}

它会自动转换成我们用于配置的对象。除了那个烦人的mode之外,所有的值都是正确的。以下是接收方法签名的样子:

代码语言:javascript
复制
@POST
@Consumes({MediaType.APPLICATION_JSON})
@Produces(MediaType.TEXT_PLAIN)
@Path("/config")
public String setConfiguration( ConsternationConfig config ) {
    ...
    // do magic
    ...
}

我已经调出了所有的东西,但都没有用。这种破坏发生在我无法控制的代码中。它进入了后置法,搞砸了。

知道会发生什么事吗?

UPDATE Per @Aleh,下面是ConsternationConfig的源代码

代码语言:javascript
复制
@XmlRootElement
public class ConsternationConfig {

    // Data members
    private Customers customers;
//  private ConsternationModulation modulation; // how modulation used to be defined, changed to the int below
    private int modulation;
    private int pointsOfConsternation;

    @XmlJavaTypeAdapter(RectangleStandInAdapter.class)
    private Rectangle window;

    /**
     * Default constructor
    */
    public ConsternationConfig() {
        customers = new Customers();
//      modulation = DEFAULT_MODULATION;  // how modulation used to be defined
        modulation = DEFAULT_MODULATION.ordinal();
        pointsOfConsternation= DEFAULT_POINTS_OF_CONSTERNATION;
        window = new Rectangle(DEFAULT_WINDOW_X, DEFAULT_WINDOW_Y, DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT);
    }

    public ConsternationModulation getModulation() {
        return ConsternationModulation.values()[modulation];
    }

    public void setModulation(int modulation) {
        this.modulation = modulation;
    }

    public void setModulation(ConsternationModulation modulation) {
        this.modulation = modulation.ordinal();
    }

...a whole bunch of other getters and setters that do nothing but set individual members...
}

这里是ConsternationModulation,这是一个很好的衡量标准:

代码语言:javascript
复制
public enum ConsternationModulation {

    INVALID,
    FIRST_CONSTERNATION,
    SECOND_CONSTERNATION,
    THIRD_CONSTERNATION,
    FOURTH_CONSTERNATION
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-05 22:19:11

问题在于,我有两种 setModulation()方法。一种允许modulation使用int设置,另一种允许使用枚举设置。我认为对话应该足够聪明,可以调用适当的setter ( int setter)。我错了。显然,两个设置者混淆了转换器,所以它也没有调用。这解释了为什么它总是以默认值(在构造函数中设置)。

删除setter的enum版本解决了问题,之后它运行得很好。策划人如上所示,但为了方便起见,这里又出现了。它没有什么特别或神奇的地方:

代码语言:javascript
复制
public void setModulation(int modulation) {
    this.modulation = modulation;
}

感谢所有的投入,特别是小精灵!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47601877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档