我正在创建一个简单的RESTful服务
@Path("/book")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Stateless
public class RestBookService {
@PersistenceContext(unitName="bookPU")
private EntityManager em;
@Context
protected UriInfo uriInfo;
@POST
public Response createBook(Book book) {
if (book == null)
throw new BadRequestException();
em.persist(book);
URI bookUri = uriInfo.getAbsolutePathBuilder().path(book.getId() + "").build();
return Response.created(bookUri).build();
}
}
本书是简单的JPA实体
@Entity
@XmlRootElement
public class Book {
static Logger log = Logger.getLogger(Book.class.getName());
public static final String FIND_ALL = "Book.find_all";
@Id
@GeneratedValue
private int id;
@Column(nullable=false)
private String title;
@Column
private Float price;
}
//只提供相关代码。有getter / setter和构造函数
我正在使用Glassfish 4.1上的Maven部署服务 我在用 泽西岛集装箱2.13 Hibernate 4.3.5 Final Mysql 5.1
当我尝试使用cURL创建一本书时如下
curl -X POST --data-binary "<book><price>12.5</price><title>Book Title</title></book>" -H "Content-Type: application/xml" http://localhost:8080/book-service/rs/book -v
抛出以下异常。
StandardWrapperValve[jersey-serlvet]: Servlet.service() for servlet jersey-serlvet threw exception
java.lang.IllegalStateException: Not inside a request scope.
at jersey.repackaged.com.google.common.base.Preconditions.checkState(Preconditions.java:149)
at org.glassfish.jersey.process.internal.RequestScope.current(RequestScope.java:228)
at org.glassfish.jersey.process.internal.RequestScope.findOrCreate(RequestScope.java:156)
at org.jvnet.hk2.internal.MethodInterceptorImpl.invoke(MethodInterceptorImpl.java:74)
at org.jvnet.hk2.internal.MethodInterceptorInvocationHandler.invoke(MethodInterceptorInvocationHandler.java:62)
at com.sun.proxy.$Proxy239.getAbsolutePathBuilder(Unknown Source)
at com.services.bookrestservice.rest.RestBookService.createBook(RestBookService.java:44)
[还有另外一个与此类似的问题,但我做的完全相同,答案仍然是我得到了例外。此外,我已经通过https://java.net/jira/browse/JERSEY-2241,但似乎处于解决状态,分辨率无法再现。 ]
请有人帮助我。
我已根据@HankCa的建议将Stateless注释更改为RequestScoped注释。现在抛出以下异常。
'javax.persistence.TransactionRequiredException
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.doTxRequiredCheck(EntityManagerWrapper.java:161)
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.doTransactionScopedTxCheck(EntityManagerWrapper.java:151)
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.persist(EntityManagerWrapper.java:281)
at com.services.bookrestservice.rest.RestBookService.createBook(RestBookService.java:44)
'
不确定为什么会出现这种异常,因为它已经存在于persistentcontext中。
@HankCa建议我做了以下更改。
删除
@Context
protected UriInfo uriInfo;
并将方法签名更新为
@POST
public Response createBook(Book book, @Context UriInfo uriInfo) {
服务按预期工作。感谢HankCa的帮助。
答案 0 :(得分:0)
是的,我长时间盯着这个,我的解决方案就像你在Why is my Jersey JAX-RS server throwing a IllegalStateException about not being in RequestScope?找到的那样。这是在一年前,我还没有再次击中它(虽然我已经离开了EJB领域一段时间)所以我会给它最好的拍摄。
具体来说,我会制作这些mod:
@RequestScoped
@Context UriInfo uriInfo
放入方法或类中。最后,我似乎已经采用了以下方法:这是代码(这是一行将列表与代码分开,因此代码显示为代码!)
@Path("/user")
@Produces({ MediaType.APPLICATION_JSON })
@Consumes({ MediaType.APPLICATION_JSON })
@RequestScoped
public class UserResource {
...
@PermitAll
@POST
public Response signupUser(CreateUserRequest request, @Context UriInfo uriInfo) {
AuthenticatedUserToken token = userService.createUser(request, Role.authenticated);
verificationTokenService.sendEmailRegistrationToken(token.getUserId());
URI location = uriInfo.getAbsolutePathBuilder().path(token.getUserId()).build();
return Response.created(location).entity(token).build();
}
我希望有所帮助!
干杯,
BBOS