在我的JAX-RS项目(Jersey)中,我遇到一个问题,即将一个JAXB注释的对象编组为JSON.这是我在日志中看到的错误消息:
严重:内部服务器错误javax.ws.rs.WebApplicationException:javax.xml.bind.JAXBException:类com.dnb.applications.webservice.mobile.view.CompaniesAndLocations或其任何超类都为此上下文所知.
这是否指出任何具体问题?我的资源有这样的方法:
@Path("/name/{companyname}/location/{location}")
@Produces("application/json; charset=UTF-8;")
@Consumes("application/json")
@POST
public Viewable findCompanyByCompanyNameAndLocationAsJSON(@PathParam("companyname") String companyName,
@PathParam("location") String location, CriteriaView criteria) {
criteria = criteria != null ? criteria : new CriteriaView();
criteria.getKeywords().setCompanyName(companyName);
return getCompanyListsHandler().listsByCompanyNameAndLocation(criteria, location);
}
Run Code Online (Sandbox Code Playgroud)
Viewable是一个空的界面.上面的方法返回一个类型的对象CompaniesAndLocations,定义如下:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "companiesAndLocations", propOrder = { "count", "normalizedLocations", "companyList", "companyMap", "modifiers",
"modifiersMap", "companyCount", "navigators" })
public class CompaniesAndLocations extends BaseCompanies implements Viewable {
@XmlElement(name = "normalizedLocations", required = false)
protected List<NormalizedLocation> normalizedLocations;
public List<NormalizedLocation> getNormalizedLocations() {
if (normalizedLocations == null) …Run Code Online (Sandbox Code Playgroud) 有谁知道如何在REST Web服务中PUT多个查询参数?我用java编写.我的curl示例是这样的:
curl -X PUT http://localhost:8080/project/resources/user/directory/sub-directory?name=shareuser&type=Read -v
Run Code Online (Sandbox Code Playgroud)
我的计划是:
@PUT
@Path("{user}/{directory:.+}")
public Response doshare(@PathParam("user")String name,
@PathParam("directory")String dir,
@QueryParam("name")String sharename,
@QueryParam("type")String type){
mongoDAOImpl impl=new mongoDAOImpl();
Mongo mongo=impl.getConnection("127.0.0.1","27017");
DB db=impl.getDataBase(mongo,"public");
DBCollection coll=impl.getColl(db,name);
DBCollection coll2=impl.getColl(db,"sharedb");
shareDTO sharedto=new shareDTO();
String authority=type.toLowerCase();
if(authority.equals("rd")){
sharedto.setAuthority("4");
}else if(authority.equals("rw")){
sharedto.setAuthority("12");
}
sharedto.setTargetuser(sharename);
sharedto.setRealURI("/home/public/"+name+"/"+dir);
sharedto.setIdentifier(name);
sharedto.setParentURI("/home/public/"+sharename);
boolean bool = false;
sharefun=new sharefunction();
if(sharefun.checksubfoldershared(coll, coll2, sharedto)){
bool=sharefun.sharefiles(coll, coll2, sharedto);
}else{
System.out.println("Error");
}
// ...
Run Code Online (Sandbox Code Playgroud)
但我只获取名称查询参数.如何获取或如何键入curl命令以获取所有查询参数?
RESTEasy(JAX-RS)允许通过子资源进行动态调度.例如:
POST /customers/create
{"name":"Smith","country":"jp"}
Run Code Online (Sandbox Code Playgroud)
我们可以使用根资源来处理路径"/ customers",其方法是使用没有HTTP方法但使用@Path("/ create")注释的方法.此方法返回JAX-RS查看的资源以继续处理请求.但是,此资源必须处理"/ customers/create"路径.
我有一个现有的情况,可以创建不同类型的实体:
POST /customers/create
{"name":"Smith"}
POST /locations/create
{"name":"Chicago"}
Run Code Online (Sandbox Code Playgroud)
我想基于请求正文中的附加属性添加创建任何类型实体的功能:
POST /entities/create
{"type":"customer","name":"Smith"}
Run Code Online (Sandbox Code Playgroud)
本质上,我想将请求转发到处理"POST/customers/create"的代码.我可以编写为"POST/entities/create"调用的子资源定位器并返回Customer资源,但是JAX-RS无法调度请求,因为Customer资源不处理路径"/ entities/create".有没有办法在转发请求时将URL更改为/ customers/create?
此时我无法更改API以使"客户"成为"实体"的真正子资源.
我使用CXF实现了JAX-RS服务.我怎样才能生成wadl?或者有没有像泽西 http://path.to.your/restapp/application.wadl那样的东西?有没有像wsdl,java到wsdl的maven插件?我找到了找不到的答案.
如何注册一个包罗万象的ExceptionMapper<Exception>,它不拦截WebApplicationException为其提供新泽西特殊处理?
更新:我提交了此功能请求:http://java.net/jira/browse/JERSEY-1607
我查看了杰克逊的文档,它让我困惑:(我的实体看起来像:
@Entity
@Table(name = "variable")
public class Variable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(unique = true, nullable = false)
private String name;
@Column
@Enumerated(EnumType.STRING)
private VariableType type;
@Column(nullable = false)
private String units;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created_on", nullable = false)
private Date createdOn;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "retired_on", nullable = true)
private Date retiredOn;
@Column(nullable = false)
private boolean core;
}
Run Code Online (Sandbox Code Playgroud)
我的JAX-RS服务看起来像
@Path("/variable")
public class VariableResource {
@Inject private VariableManager variableManager;
@GET
@Produces(MediaType.APPLICATION_JSON)
public …Run Code Online (Sandbox Code Playgroud) 我想知道如何检查Play Framework 2.1中的HTTP请求.我可以在文档中找到的唯一信息是通过该conf/routes机制:
GET /clients/:id controllers.Clients.show(id: Long)
Run Code Online (Sandbox Code Playgroud)
但这只允许我们id从路径中获取参数.如何访问请求的其他部分,例如标题或查询参数?换句话说,什么是JAX-RS的Play的等价物@HeaderParam,@FormParam,@QueryParam等?
我有一个端点:
@POST
@Path("/test")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public String canaryTest(String JSON) {
return JSON;
}
Run Code Online (Sandbox Code Playgroud)
当我使用Jersey在Jetty中注册时
ServletHolder holder = new ServletHolder(new ServletContainer());
Run Code Online (Sandbox Code Playgroud)
一切似乎都很好.但是,如果我尝试明确指定默认配置,它将停止工作(从端点返回媒体类型错误).即使只是将ResourceConfig的默认实例传递给ServletContainer,它也会停止工作.
ResourceConfig config = new ResourceConfig();
//config.property(x,defaultX)
//config.property(y,defaultY)
ServletHolder holder = new ServletHolder(new ServletContainer(config));
Run Code Online (Sandbox Code Playgroud)
我想手动和显式地模拟默认配置行为,所以我在这里要问的是我应该如何配置ResourceConfig以使行为保持工作(即,要设置的属性)
PS:我正在使用Jetty 9.2.6.v20141205和Jersey 2.14.Maven中的依赖关系:
我使用Jersey 2在IBM WebSphere 8.5环境中实现JAR-RS 2.0.
在阅读了这篇文章后,我在Websphere 8中获得了JAX-RS Jersey 2.10支持,我设法让这个工作.
但是,是否可以在WAR中捆绑JAX-RS Jars并部署应用程序而无需创建隔离的共享库?如果这是不可能的,有人可以解释为什么会这样吗?
我理解在库中使用Jars的部署时间优势,但我更愿意将整个应用程序(包括依赖项)构建到单个WAR中.
- 编辑 -
如果更改类加载顺序,您似乎可以从WAR中加载JAX-RS jar.您需要更改顺序以最后加载父类.这可以如下完成;
在管理控制台中:
Applications - > WebSphere enterprise applications - > {your.application} - > Manage Modules - > {your.module}
将类加载器顺序下拉列表更改为:"首先使用本地类加载器加载的类(父类最后一个)".
但是,这表明附加的Stackoverflow文章中缺少某些JVM属性.
任何人都可以对这种情况有所了解吗?
是否可以为两个类定义相同的路径?
@Path("/resource")
public class ResourceA{
..
..
}
@Path("/resource")
public class ResourceB(){
..
..
}
Run Code Online (Sandbox Code Playgroud)