泽西岛破坏了来自 JSON 的数据?
Jersey mangles data from JSON?
我们有一个使用 Jersey 框架实现的 REST Web 服务,允许用户保存来自 UI 的配置信息。有一个 GET(获取当前配置信息)和一个相应的 POST 来保存设置。该数据保存在 JSON 文件中。 GET 工作得很好,POST exept 对一个值也是如此:
"modulation": 2,
不管这个值设置成什么,从POST中的UI获取数据时,总是默认值。其他值都是完美的。
这个值曾经是一个枚举,因为文件中的所有内容都保存为 int
或 String
,我认为这可能会混淆它。所以我把它改成了 int
。那没有帮助。从好的方面来说,它也没有使任何事情变得更糟。
使用优秀的邮递员,我发送了一个 JSON 结构 POST:
{
"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 方法被破坏。
知道会发生什么吗?
更新
根据@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
}
问题是我有 两个 setModulation()
方法。一个允许 modulation
使用 int 设置,另一个使用枚举。我认为对话会足够聪明,可以调用适当的 setter(int setter)。我错了。显然,有两个 setters 混淆了转换器,所以它没有调用任何一个。这就解释了为什么它总是处于默认值(在构造函数中设置)。
删除 setter 的枚举版本解决了这个问题,之后它工作正常。 setter 如上所示,但为方便起见,这里又出现了。没有什么特别或神奇的:
public void setModulation(int modulation) {
this.modulation = modulation;
}
感谢所有的输入,尤其是 peeskillet!
我们有一个使用 Jersey 框架实现的 REST Web 服务,允许用户保存来自 UI 的配置信息。有一个 GET(获取当前配置信息)和一个相应的 POST 来保存设置。该数据保存在 JSON 文件中。 GET 工作得很好,POST exept 对一个值也是如此:
"modulation": 2,
不管这个值设置成什么,从POST中的UI获取数据时,总是默认值。其他值都是完美的。
这个值曾经是一个枚举,因为文件中的所有内容都保存为 int
或 String
,我认为这可能会混淆它。所以我把它改成了 int
。那没有帮助。从好的方面来说,它也没有使任何事情变得更糟。
使用优秀的邮递员,我发送了一个 JSON 结构 POST:
{
"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 方法被破坏。
知道会发生什么吗?
更新
根据@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
}
问题是我有 两个 setModulation()
方法。一个允许 modulation
使用 int 设置,另一个使用枚举。我认为对话会足够聪明,可以调用适当的 setter(int setter)。我错了。显然,有两个 setters 混淆了转换器,所以它没有调用任何一个。这就解释了为什么它总是处于默认值(在构造函数中设置)。
删除 setter 的枚举版本解决了这个问题,之后它工作正常。 setter 如上所示,但为方便起见,这里又出现了。没有什么特别或神奇的:
public void setModulation(int modulation) {
this.modulation = modulation;
}
感谢所有的输入,尤其是 peeskillet!