我有一个使用Jersey编写的RESTful Web服务,如下所示:
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response myAction(RequestObject requestObject) {
// do some action
}
Run Code Online (Sandbox Code Playgroud)
请求对象只是一个简单的DTO:
public class RequestObject implements Serializable {
private String theString;
// Getter for member
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用空请求有效负载执行POST时,我希望RequestObject要么为null,要么theString为null.相反,我得到了这个:
根本原因
java.io.EOFException: No content to map to Object due to end of input
org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2766)
org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2682)
org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1308)
org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:419)
com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy.readFrom(JacksonProviderProxy.java:139)
com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:483)
com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123)
com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46)
com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153)
com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203)
com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1480)
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1411)
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1360)
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1350)
com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
当我使用看起来像这样的请求有效负载发布时,我得到了所需的结果(theString设置为null):
{}
问题:有没有办法接受空请求有效负载,并在服务器端处理它?
注意:我正在使用泽西提供的POJO支持.
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
Run Code Online (Sandbox Code Playgroud) 使用自定义列类型时,我在Slick 2.1.0中查询/过滤时遇到一些困难.我的问题的简化版本:
import scala.slick.driver.MySQLDriver.simple._
sealed class Status(val intValue: Int)
case object Active extends Status(1)
case object Disabled extends Status(2)
case object Deleted extends Status(3)
case class TableMapping(id: Long, status: Status)
class MyTableDefinition(tag: Tag) extends Table[TableMapping](tag, "sometable") {
implicit val statusColumnType = MappedColumnType.base[Status, Int](statusToInt, intToStatus)
def id = column[Long]("ID", O.PrimaryKey, O.AutoInc)
def status = column[Status]("STATUS", O.NotNull, O.Default(Active))
def * = (id, status) <> (TableMapping.tupled, TableMapping.unapply)
private def statusToInt(s: Status): Int = s.intValue
private def intToStatus(i: Int): Status = i match { …Run Code Online (Sandbox Code Playgroud) 我正在使用Install4J为我的应用程序构建一个安装(让我们称之为MainApp),它运行良好.
为了能够使用MainApp,您还需要安装我的第二个应用程序(让我们称之为SecondApp).
我的问题是这个.有没有办法让Install4J首先安装MainApp,并且作为安装的最后一步下载SecondApp(位于Web服务器上的exe文件)并执行它?
我正在开发一个使用scala 2.9.2和java 7的项目.
我要做的是使用scala ListView创建一个GUI.
这是一个小代码片段:
private val listView = new ListView[Document](someList)
.
.
.
for (selectedDocument <- listView.peer.getSelectedValuesList) {
doSomething(selectedDocument)
}
Run Code Online (Sandbox Code Playgroud)
这给了我以下编译错误:
error: something is wrong (wrong class file?): class JList with type parameters [E] gets applied to arguments [], phase = namer for (selectedDocument <- listView.peer.getSelectedValuesList) {
Run Code Online (Sandbox Code Playgroud)
我猜这是因为在ListView中,peer没有类型参数定义:
override lazy val peer: JList = new JList with SuperMixin
Run Code Online (Sandbox Code Playgroud)
所以问题是:使用Java 7中的scala-swing是否无法使用ListView?
我正在使用play framework(2.3.x)来构建一个restful API.
今天我有一个try/catch块围绕API控制器中的所有api函数,以便能够捕获异常并返回一个通用的"错误json"对象.
例:
def someApiFuntion() = Action { implicit request =>
try {
// Do some magic
Ok(magicResult)
} catch {
case e: Exception =>
InternalServerError(Json.obj("code" -> INTERNAL_ERROR, "message" -> "Server error"))
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否有必要在每个api函数中使用try/catch thingy,还是有更好/更通用的方法来解决这个问题?