你能结合 Jersey 和 Spring(@Provider 和 @Component)吗?
Can you combine Jersey and Spring (@Provider and @Component)?
我已经在做的事情:
- Spring版本4.1.4.RELEASE.
- 球衣版本2.14.
- 我添加了 Maven 依赖项 jersey-spring3 并从中排除了 spring (spring-core, spring -web, spring-beans).
- Spring 个组件被扫描为 -
@ComponentScan
。
- "Controllers" 在泽西岛
ResourceConfig
... 注册
- ... 并用
@Path
和 @Component
... 注释
- ... 这样
@Autowired
beans 从数据库中获取 (@Transactional
) 个 POJO...
- ... 和 Jersey 在某些
@Provider
s returns 的帮助下以 JSON. 的形式出现
问题似乎在于,在我添加注释 @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();
}
}
我已经在做的事情:
- Spring版本4.1.4.RELEASE.
- 球衣版本2.14.
- 我添加了 Maven 依赖项 jersey-spring3 并从中排除了 spring (spring-core, spring -web, spring-beans).
- Spring 个组件被扫描为 -
@ComponentScan
。 - "Controllers" 在泽西岛
ResourceConfig
... 注册
- ... 并用
@Path
和@Component
... 注释
- ... 这样
@Autowired
beans 从数据库中获取 (@Transactional
) 个 POJO... - ... 和 Jersey 在某些
@Provider
s returns 的帮助下以 JSON. 的形式出现
问题似乎在于,在我添加注释 @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();
}
}