我创建了一个包含两个资源的简单REST服务。第一个资源很有效,只返回MediaType.TEXT_PLAIN。
对于第二个资源,我想尝试将POJO映射到Java并遵循以下示例:
我的testbean定义为:
@XmlRootElement
public class Company {
public String name;
public String symbol;
public String country;
public Company(String name, String symbol,
String country) {
this.name = name;
this.symbol = symbol;
this.country = country;
}
public String getName() {
return name;
}
public String getSymbol() {
return symbol;
}
public String getCountry() {
return country;
}
}
资源也是微不足道的:
@Path("company/{name}")
public class CompanyResource {
private Map<String, Company> companies;
public CompanyResource() {
companies = new LinkedHashMap<String, Company>();
companies.put("Apple", new Company("Apple Inc.", "AAPL", "USA"));
companies.put("Microsoft", new Company("Microsoft Corp.", "MSFT", "USA"));
companies.put("Honda", new Company("Honda Motor Co Ltd", "HMC", "Japan"));
companies.put("Random", new Company("Random Inc.", "RND", "Undefined"));
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public Company getCompany(@PathParam("name") String name) {
Company cmp = companies.get(name);
if (cmp == null) {
return companies.get("Random");
}
return cmp;
}
}
我调试了一个请求并且没有问题地返回return语句。但是,从这里开始,我认为抛出了一个JAXBException,但我无法查看详细信息,任何日志中都没有任何内容。所有这一切都是浏览器显示“内部服务器错误500”消息。
在监控配置下,我绝望地将一切设置为HIGH。仍然没有任何地方出现。
我发现的唯一类似问题是jax-rs 2.0 and Glassfish 4 unable to @consume JSON into Pojo和JAX RS Jersey + JSON --> HTTP 500 Internal Server Error,但它们似乎并不完全相关。
对于客户,我只是将Google Chrome与“高级REST客户端”应用程序一起使用。
非常感谢任何帮助。
答案 0 :(得分:11)
您需要在Company
课程中提供无参数构造函数。如果您想限制谁可以访问构造函数,您可以将其设为私有。
private Company() {
}
答案 1 :(得分:0)
尝试将param“name”放在不在类中的方法中:
@Path("company")
public class CompanyResource {
private Map<String, Company> companies;
public CompanyResource() {
companies = new LinkedHashMap<String, Company>();
companies.put("Apple", new Company("Apple Inc.", "AAPL", "USA"));
companies.put("Microsoft", new Company("Microsoft Corp.", "MSFT", "USA"));
companies.put("Honda", new Company("Honda Motor Co Ltd", "HMC", "Japan"));
companies.put("Random", new Company("Random Inc.", "RND", "Undefined"));
}
@GET @PathParam("{name}")
@Produces(MediaType.APPLICATION_JSON)
public Company getCompany(@PathParam("name") String name) {
Company cmp = companies.get(name);
if (cmp == null) {
return companies.get("Random");
}
return cmp;
}
}
如果你想以你展示的方式使用它,你必须添加一个带有“name”的构造函数作为字段:
public CompanyResource(@PathParam("name") String name) {
this.name = name;
}
答案 2 :(得分:0)
一个 - 遗憾的是记录不足 - 可能发生的问题:
如果您声明字段transient
,请不要使用@XmlTransient
对其进行注释。 transient
字段实际上是xml瞬态的,您不再需要注释。
当我在字段desk
上违反此规则时发生这种情况:
2016-11-30T14:09:33.731-0500|Severe:
com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: IllegalAnnotationException
Transient field "desk" cannot have any JAXB annotations.
this problem is related to the following location:
at @javax.xml.bind.annotation.XmlTransient()
at my.package.Desk