Rest Jersey JAX-RS Glassfish 4抛出java.lang.IllegalStateException
我正在创建一个简单的RESTful服务Rest Jersey JAX-RS Glassfish 4抛出java.lang.IllegalStateException,rest,glassfish-4.1,Rest,Glassfish 4.1,我正在创建一个简单的RESTful服务 @Path("/book") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Stateless public class RestBookService { @PersistenceContext(unitName="bookP
@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最终版本
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
[还有一个问题与此类似,但我所做的与答案中给出的完全相同。我仍然得到了例外。此外,我也经历了,但它似乎处于已解决状态,无法复制决议。]
谁能帮帮我吗
编辑1
我已经从无状态注释更改为@HankCa建议的RequestScope注释。它现在抛出以下异常
'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中
编辑2
@汉卡建议我做以下改变
除去
@Context
protected UriInfo uriInfo;
并将方法签名更新为
@POST
public Response createBook(Book book, @Context UriInfo uriInfo) {
而且服务正在按预期工作。谢谢HankCa的帮助。是的,我盯着这个问题看了太久,我的解决方案和你在网站上找到的一样。这是一年前的事了,虽然我离开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我已经在github上添加了该项目。这里是链接。邀请@HankCa,因为他之前也有类似的问题。如果我在这里遗漏了什么,请看一看。试着丢失UriInfo看看有什么不同。@HankCa。你就是那个人!我删除了UriInfo,并且能够通过restful服务创建和获取行。然后,我在方法中而不是类中注入了UriInfo,它成功了。所以这个问题的答案是从类中删除UriInfo并将其作为方法参数。恭喜!所以我的答案是正确的,你能这样打勾吗?另一件我想尝试的事情是JBoss Wildfly作为一种替代的开源web应用服务器,它不是操作系统本身,而是主要基于操作系统组件。新版本的Glassfish发布花了15个月的时间,虽然我希望它的支持已经获得了牵引力,但我会比较其他版本。感谢您快速来到这里,并为此投入一些时间。我将修改代码并将其签出。我在尝试RequestScope注释后添加了EDIT1。我还是有个例外。虽然不一样,但还是很奇怪
@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();
}