泽西岛破坏了JSON的数据?

时间:2017-12-01 21:40:53

标签: java json rest jersey

我们有一个使用Jersey框架实现的REST Web服务,允许用户从UI保存配置信息。有一个GET(获取当前配置信息)和相应的POST来保存设置。该数据保存在JSON文件中。 GET工作完美,POST exept 也适用于一个值:

"modulation": 2,

无论此值设置为何,在POST中从UI获取数据时,它始终是默认值。其他每一个价值都是完美的。

此值曾经是枚举,因为文件中的所有内容都保存为intString,我认为这可能会让人感到困惑。所以我把它改成int。这没有任何帮助。从好的方面来看,它也没有变得更糟。

使用好的'邮递员,我发送了一个带有POST的JSON结构:

{
    "customers": {
        "max": 20,
        "current": 2
    },
    "window": {
        "x": 10,
        "y": 10,
        "width": 20,
        "height": 20
    },
    "modulation": 2,    // always just the default, 1
    "pointsOfConsternation": 20
}

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

@POST
@Consumes({MediaType.APPLICATION_JSON})
@Produces(MediaType.TEXT_PLAIN)
@Path("/config")
public String setConfiguration( ConsternationConfig config ) {
    ...
    // do magic
    ...
}

我已经调试了它的垃圾无济于事。修改发生在我无法控制的代码中。它进入了破坏的POST方法。

关于可能发生的事情的任何想法?

更新 Per @Aleh Maksimovich,这里是ConsternationConfig的来源:

@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只是为了好的措施:

public enum ConsternationModulation {

    INVALID,
    FIRST_CONSTERNATION,
    SECOND_CONSTERNATION,
    THIRD_CONSTERNATION,
    FOURTH_CONSTERNATION
}

1 个答案:

答案 0 :(得分:0)

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

删除setter的枚举版本修复了问题,之后运行正常。设定器如上所示,但为方便起见,这里再次出现。没有什么特别或神奇的东西:

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

感谢所有的输入,特别是peeskillet!