你能结合 Jersey 和 Spring(@Provider 和 @Component)吗?

Can you combine Jersey and Spring (@Provider and @Component)?

我已经在做的事情:

  1. Spring版本4.1.4.RELEASE.
  2. 球衣版本2.14.
  3. 我添加了 Maven 依赖项 jersey-spring3 并从中排除了 spring (spring-core, spring -web, spring-beans).
  4. Spring 个组件被扫描为 - @ComponentScan
  5. "Controllers" 在泽西岛 ResourceConfig...
  6. 注册
  7. ... 并用 @Path@Component...
  8. 注释
  9. ... 这样 @Autowired beans 从数据库中获取 (@Transactional) 个 POJO...
  10. ... 和 Jersey 在某些 @Providers returns 的帮助下以 JSON.
  11. 的形式出现

问题似乎在于,在我添加注释 @Component 后,用 @Provider 注释的 类 停止工作。

有人成功地组合了这些注释吗?如果是,那我错过了什么?如果没有,那么很明显我必须转向替代库。 :)

您可以使用 Spring 的 RestController,它是在 Spring 4.0 中添加的。它允许您使用 Autowired 等等。

@RestController
@RequestMapping("/msg")
public class MessageRestController {

     @Autowired
     private IShortMessageService shortMessageService;    

     @RequestMapping(value = "/message-json/{id}", method = RequestMethod.GET, produces = "application/json")
     public ShortMessageDto getMessageJSONById(@PathVariable String id) {
           Long id_value = null;
           try {
                id_value = Long.parseLong(id);
                ShortMessageDto message = shortMessageService.getById(id_value);
                if(message != null){
                return message;
           } catch (NumberFormatException e){
                // log message                    
           }                   
               return null;
      }

}

虽然我认为使用 RestController 可能是更好的方法,但这段代码(下面)有效 - 所以我的回答可能对每个被迫使用 Jersey + Spring(无论出于何种原因)的人都有用...)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;

import javax.persistence.EntityNotFoundException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class EntityNotFoundExceptionMapper implements ExceptionMapper<EntityNotFoundException> {

    private final ApplicationContext applicationContext;

    @Autowired
    public EntityNotFoundExceptionMapper(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @Override
    public Response toResponse(EntityNotFoundException exception) {
        return Response.status(Response.Status.NOT_FOUND).build();
    }
}