@Path("/abc")
@Produces(MediaType.APPLICATION_JSON)
public class ABCController
{
@Autowired
private MyService myService;
@GET
public Response getSome(@QueryParam("identification") List<String> ids)
{
GenericEntity<List<Label>> entity = new GenericEntity<>(myService.findSomething(ids))
{
};
return Response.ok(entity).build();
}
我的服務:
@RequiredArgsConstructor
@Service
public class MyService
{
private final MyMapper myMapper;
private final JpaRepository myRepository;
public List<String> findSomething(ids){
myRepository.findXYZ(ids);
}
我的主課:
@SpringBootApplication
public class MainClass
{
public static void main(String[] args)
{
SpringApplication.run(MainClass.class, args);
}
@Bean
public MyMapper myMapper()
{
return new MyMapperImpl();
}
}
構建.gradle:
buildscript {
ext {
LOMBOK_VERSION = "1.18.22"
SPRING_BOOT_VERSION = "2.6.6"
JERSEY_VERSION = "3.0.8"
JACKSON_VERSION = "2.13.1"
MSSQL_JDBC_VERSION = "9.4.1.jre11"
MAPSTRUCT = "1.5.1.Final"
}
}
plugins {
id "org.gretty" version "4.0.3"
}
apply plugin: 'java-library'
apply plugin: 'java'
apply plugin: 'war'
repositories {
mavenLocal()
maven {
url = '...'
}
}
dependencies {
compileOnly "org.projectlombok:lombok:${LOMBOK_VERSION}"
testImplementation "org.projectlombok:lombok:${LOMBOK_VERSION}"
annotationProcessor "org.projectlombok:lombok:${LOMBOK_VERSION}"
implementation "org.mapstruct:mapstruct:${MAPSTRUCT}"
annotationProcessor "org.mapstruct:mapstruct-processor:${MAPSTRUCT}"
implementation "org.springframework.boot:spring-boot-starter-data-jpa:${SPRING_BOOT_VERSION}"
implementation "com.microsoft.sqlserver:mssql-jdbc:${MSSQL_JDBC_VERSION}"
implementation "org.glassfish.jersey.containers:jersey-container-servlet-core:${JERSEY_VERSION}"
implementation "org.glassfish.jersey.inject:jersey-hk2:${JERSEY_VERSION}"
implementation "org.glassfish.jersey.media:jersey-media-json-jackson:${JERSEY_VERSION}"
}
當我打電話時http://localhost:8080/myservice/abc?identification=61234561234569,71234561234568,71234561234569
我有NullPointerException一個myService.findSomething(ids)
我用 gradle 命令啟動應用程式appRun
uj5u.com熱心網友回復:
雖然 spring 帶來了他自己的“REST-Service 開發框架”(彈簧網),應該沒有理由,為什么JAX-RS不能使用彈簧芯乃至彈簧靴.
問題(對于那個特定的 NPE)是:
對于自動連線:兩個(連線和連線)物件都需要“彈簧管理(bean)”!;) 在 MyService 中,這是通過 @Service 注釋實作的。
為了解決這個問題,我們還需要在 spring 背景關系中參與 ABCController !
“侵入性最小”/最簡單的方法 - 用ABCController注釋@Component:
...
import org.springframework.stereotype.Component;
@Component // !
@Path("/abc")
@Produces(MediaType.APPLICATION_JSON)
public class ABCController ...
這( 正確的“組件掃描”)將“提升” ABCController 進入彈簧背景關系并啟用自動連接(從/到)該物件。
另一種方法,將“實作”與 spring 解耦:
為此,我們需要org.springframework.*從“與彈簧無關”的類中洗掉所有(可能的)匯入。(當然,在特定于 spring 的類(spring-web(Rest)Controllers,Spring-data-repos,...)中是不可能的。
- 為了替換
@Component/Service/Repository注釋,我們將實體化移動@Bean到我們的 spring 配置(類(es))的注釋方法(..see MyMapper bean!) - 要替換
@Autowired我們必須“手動連接”它們或使用“隱式建構式自動連接”(在提到的@Bean方法中)
因此,您的 Config(/SpringBootApp) 可能如下所示:
@SpringBootApplication
public class MainClass
{
public static void main(String[] args)
{
SpringApplication.run(MainClass.class, args);
}
@Bean
public MyMapper myMapper()
{
return new MyMapperImpl();
}
@Bean // singleton is default "scope"!!...
public MyService myService(/*implicitly @Autowired :*/ JPARepository repo, MyMapper mapper /* ..and taken care (hopefully;) by spring*/) {
return new MyService(mapper, repo);
}
// and:
@Bean
public ABCController abcController(/*implicitly @Autowired :*/ MyService service /* ..and taken care (hopefully;) by spring*/) {
ABCController bean = new ABCController();
bean.setMyService(service);
return bean;
}
}
對 ABCController 進行相應的調整:
@Path("/abc")
@Produces(MediaType.APPLICATION_JSON)
public class ABCController
{
// NOT @Autowired
private MyService myService;
...
// Setter(/getter) for myService !
uj5u.com熱心網友回復:
這是 spring-boot 中 jersey 的依賴項:spring-boot-starter-jersey
build.gradle 看起來像這樣:
buildscript {
ext {
LOMBOK_VERSION = "1.18.22"
SPRING_BOOT_VERSION = "2.6.6"
JERSEY_VERSION = "3.0.8"
JACKSON_VERSION = "2.13.1"
MSSQL_JDBC_VERSION = "9.4.1.jre11"
MAPSTRUCT = "1.5.1.Final"
}
}
apply plugin: 'java-library'
apply plugin: 'java'
apply plugin: 'war'
repositories {
mavenLocal()
maven {
...
}
}
dependencies {
compileOnly "org.projectlombok:lombok:${LOMBOK_VERSION}"
testImplementation "org.projectlombok:lombok:${LOMBOK_VERSION}"
annotationProcessor "org.projectlombok:lombok:${LOMBOK_VERSION}"
implementation "org.mapstruct:mapstruct:${MAPSTRUCT}"
annotationProcessor "org.mapstruct:mapstruct-processor:${MAPSTRUCT}"
implementation "org.springframework.boot:spring-boot-starter-jersey:${SPRING_BOOT_VERSION}"
implementation "org.springframework.boot:spring-boot-starter-data-jpa:${SPRING_BOOT_VERSION}"
implementation "com.microsoft.sqlserver:mssql-jdbc:${MSSQL_JDBC_VERSION}"
}
控制器成為@Component
@Path("/abc")
@Produces(MediaType.APPLICATION_JSON)
@Component
public class ABCController
{
@Autowired
private MyService myService;
@GET
public Response getSome(@QueryParam("identification") List<String> ids)
{
GenericEntity<List<Label>> entity = new GenericEntity<>(myService.findSomething(ids))
{
};
return Response.ok(entity).build();
}
MainClass 是 servlet:
@SpringBootApplication
public class MainClass extends SpringBootServletInitializer
{
public static void main(String[] args)
{
new MainClass().configure(new SpringApplicationBuilder(MainClass.class)).run(args);
}
@Bean
public MyMapper myMapper()
{
return new MyMapperImpl();
}
}
我的服務是一個@Service
@RequiredArgsConstructor
@Service
public class MyService
{
我添加了一個 JerseyConfig:
@Component
public class JerseyConfig extends ResourceConfig
{
public JerseyConfig()
{
register(ABCController.class);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/513935.html
上一篇:Node.js服務的監控機制
下一篇:架構師的必備素質和成長途徑
